none
vb.net自动填写网页表单的问题 RRS feed

  • 问题

  •  

    你好,我用的是vb.net 2005,我想做个自动填写网页表单的程序(从数据库中读取数据填写),但要判断相关条件。现在有个问题,当一个证件号码已经存在时,网页会弹出提示;而当这个号码错误时,内容又不一样,所以我想问下要怎样得到网页弹出的对话框的内容?然后根据内容执行下一步操作?恳请指教,非常感谢。
    2008年12月4日 8:58

答案

  • Imports System.Runtime.InteropServices

     

     

        'api constant declarations...
        Const WM_GETTEXT As Long = &HD
        Const WM_GETTEXTLENGTH As Long = &HE
        Const GW_ENABLEDPOPUP As Long = 6
        Const BM_CLICK As Long = &HF5&
        Const GW_CHILD As Long = 5
        Const GW_HWNDNEXT As Long = 2

        'function to retrieve the popup window associated with the form, as well as to find the child windows of the popup...
        Private Declare Auto Function GetWindow Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal uCmd As Integer) As IntPtr

        Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Integer

        'sendmessage overload that is used to send messages to the button on the dialog window...
        Private Declare Auto Function SendMessage Lib "user32.dll" Alias "SendMessage" (ByVal hWnd As IntPtr, ByVal Msg As Integer, _
        ByVal wParam As Integer, ByRef lParam As IntPtr) As IntPtr

     

       'sendmessage overloads used to retrieve the window text...
        Private Declare Auto Function SendMessageA Lib "user32.dll" Alias "SendMessageA" (ByVal hWnd As IntPtr, ByVal Msg As Integer, _
        ByVal wParam As IntPtr, ByRef lParam As IntPtr) As IntPtr
        <DllImport("User32.dll", CharSet:=CharSet.Auto, Entrypoint:="SendMessage")> _
        Public Shared Function SendMessageString(ByVal hwnd As IntPtr, _
        ByVal wMsg As Integer, ByVal wparam As Integer, ByVal lparam As System.Text.StringBuilder) As IntPtr
        End Function

    2008年12月9日 3:52
    版主
  •  

     

    Code Snippet

     'these next three functions are used to enumerate the Windows handles of all Windows sited on the specified parent...
        Function GetChildWindowHandles(ByVal ParentWindowHandle As IntPtr) As ArrayList

            Dim b As Boolean
            Dim ptrChild As IntPtr
            Dim clsRet As New ArrayList

            'get first child handle...
            ptrChild = GetChildWindowHandle(ParentWindowHandle)

            Do Until ptrChild.Equals(IntPtr.Zero)
                'add to collection of handles...
                clsRet.Add(ptrChild)
                'get next child...
                ptrChild = GetNextWindowHandle(ptrChild)
            Loop

            'return...
            Return clsRet

        End Function

        Function GetChildWindowHandle(ByVal ParentWindowHandle As IntPtr) As IntPtr
            Return GetWindow(ParentWindowHandle, GW_CHILD)
        End Function

        Function GetNextWindowHandle(ByVal CurrentWindowhandle As IntPtr) As IntPtr
            Return GetWindow(CurrentWindowhandle, GW_HWNDNEXT)
        End Function

        'this function returns the text of the window, used so that we can confirm that we have the right dialog window...
        Function GetWindowText(ByVal WindowHandle As IntPtr) As String

            Dim ptrRet As IntPtr
            Dim ptrLength As IntPtr

            'get length for buffer...
            ptrLength = SendMessageA(WindowHandle, WM_GETTEXTLENGTH, IntPtr.Zero, IntPtr.Zero)

            'create buffer for return value...
            Dim sb As New System.Text.StringBuilder(ptrLength.ToInt32 + 1)

            'get window text...
            ptrRet = SendMessageString(WindowHandle, WM_GETTEXT, ptrLength.ToInt32 + 1, sb)

            'get return value...
            Return sb.ToString

        End Function

     

     

     

     

    2008年12月9日 3:53
    版主

全部回复

  • 通过跟踪脚本 你先要确认这个母页面有几个frame

    然后 可以通过  window.framesIdea  访问每个frame  弹出windows应该是其中的一个特殊frame

     

     

    2008年12月5日 1:55
  • frame已经找到,但你可能不明白我的意思。我是说要根据网页反馈的信息进行下一步操作。比如输入重复号码时,会有一个弹出的对话框(网页中应该是alert)告诉我“号码已经存在”,那么我要在我的程序中得到这个对话框的内容,然后进行下一步的操作。我的问题就是,怎么得到网页中弹出对话框(也就是alert的内容)。我的思路是枚举当前所有窗口,找到这个对话框后用getdlgtext或者GetWindowText得到其中的内容,但不知道具体如何实现,恳请高手指教,非常感谢!

    2008年12月5日 3:41
  •  非狐 写:

    frame已经找到,但你可能不明白我的意思。我是说要根据网页反馈的信息进行下一步操作。比如输入重复号码时,会有一个弹出的对话框(网页中应该是alert)告诉我“号码已经存在”,那么我要在我的程序中得到这个对话框的内容,然后进行下一步的操作。我的问题就是,怎么得到网页中弹出对话框(也就是alert的内容)。我的思路是枚举当前所有窗口,找到这个对话框后用getdlgtext或者GetWindowText得到其中的内容,但不知道具体如何实现,恳请高手指教,非常感谢!

    frame对象  就是window对象  第一个成员就是document

    直接用document.body.innerhtml就可以得到内容 全部都符合dom

     

     

    2008年12月5日 4:11
  •  

    大哥,虽然我很感谢你的热心,但你的回答还是~~

    我说了你固然可以得到全部的内容,但是,这个alert只有在特定的条件下出现,比如我输入了重复的,我就根据这个alert知道是重复了,转到重复的处理;加入我输入错误的,那么这个alert又不同,我又要转到另一个错误处理;而如果是正确的,那么就没有alert,我就继续正常的操作,understand?

    2008年12月5日 6:34
  •  非狐 写:

     

    大哥,虽然我很感谢你的热心,但你的回答还是~~

    我说了你固然可以得到全部的内容,但是,这个alert只有在特定的条件下出现,比如我输入了重复的,我就根据这个alert知道是重复了,转到重复的处理;加入我输入错误的,那么这个alert又不同,我又要转到另一个错误处理;而如果是正确的,那么就没有alert,我就继续正常的操作,understand?

    那么你说的就是alert而不是弹出的网页对话框了 

    以前说的frames的问题全部都无效  你看不懂是正常  因为我提供的方法和alert无关 误会误会

     

     

     

    这个更好办   不过需要分析原来的代码作检查产生alert的脚本究竟在哪里    你找到检查操作的事件就可以知道代码块

    document.scriptsIdea

     

    然后找到这个script块的index(从头开始  一个一个看innertext)  找到那个块 

     用你自己的script代码代替他的相应脚本 

     

    比如把它的alert("重复") 修改成 document.body.title="重复"  

     

    这个块被你替换了以后 只要出现重复 网页的标题就变成“重复”  你直接访问title就知道结果了

     

    当然在下一次提交前要把标题重新改成别的

     

     

     

    2008年12月5日 7:16
  •  

    大哥,我简直被你气死了,根本是~~

    干脆简单的举个例子吧。

    <script>

    if id='123' then

    alert('重复号码')

    end if

    if id='234' then

    alert('错误的号码')

    end if

    </script>

    然后我的程序用的webbrower控件,打开这个网页后,怎么获取到这其中的alert的内容呢?
    2008年12月6日 3:16
  •  非狐 写:

     

    大哥,我简直被你气死了,根本是~~

    干脆简单的举个例子吧。

    <script>

    if id='123' then

    alert('重复号码')

    end if

    if id='234' then

    alert('错误的号码')

    end if

    </script>

    然后我的程序用的webbrower控件,打开这个网页后,怎么获取到这其中的alert的内容呢?

    alert 是无法得到内容的  我建议你用得到代码块的innertext  替换代码的方式解决

    你觉得我故意气你我也没办法 >_<

    2008年12月8日 1:39
  • 大哥你误会了,我不是说你故意气我呢,你真是好人,这么耐心的回答我的问题。

     绝对有办法得到alert 的内容,我用过一个软件sysexplorer,就可以,得到任意窗口的内容,也包括网页弹出的这个alert,不信你可以下载了试下,只是不知道是什么原理。我说了可能有个getdlgtext的函数,但不知道具体怎么用。继续期待~~

    2008年12月8日 7:43
  •  

    继续寻求高手的帮助,谢谢了
    2008年12月9日 2:23
  •  

    你可以去c++区问问获取窗体内容的api
    2008年12月9日 2:51
  • Imports System.Runtime.InteropServices

     

     

        'api constant declarations...
        Const WM_GETTEXT As Long = &HD
        Const WM_GETTEXTLENGTH As Long = &HE
        Const GW_ENABLEDPOPUP As Long = 6
        Const BM_CLICK As Long = &HF5&
        Const GW_CHILD As Long = 5
        Const GW_HWNDNEXT As Long = 2

        'function to retrieve the popup window associated with the form, as well as to find the child windows of the popup...
        Private Declare Auto Function GetWindow Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal uCmd As Integer) As IntPtr

        Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Integer

        'sendmessage overload that is used to send messages to the button on the dialog window...
        Private Declare Auto Function SendMessage Lib "user32.dll" Alias "SendMessage" (ByVal hWnd As IntPtr, ByVal Msg As Integer, _
        ByVal wParam As Integer, ByRef lParam As IntPtr) As IntPtr

     

       'sendmessage overloads used to retrieve the window text...
        Private Declare Auto Function SendMessageA Lib "user32.dll" Alias "SendMessageA" (ByVal hWnd As IntPtr, ByVal Msg As Integer, _
        ByVal wParam As IntPtr, ByRef lParam As IntPtr) As IntPtr
        <DllImport("User32.dll", CharSet:=CharSet.Auto, Entrypoint:="SendMessage")> _
        Public Shared Function SendMessageString(ByVal hwnd As IntPtr, _
        ByVal wMsg As Integer, ByVal wparam As Integer, ByVal lparam As System.Text.StringBuilder) As IntPtr
        End Function

    2008年12月9日 3:52
    版主
  •  

     

    Code Snippet

     'these next three functions are used to enumerate the Windows handles of all Windows sited on the specified parent...
        Function GetChildWindowHandles(ByVal ParentWindowHandle As IntPtr) As ArrayList

            Dim b As Boolean
            Dim ptrChild As IntPtr
            Dim clsRet As New ArrayList

            'get first child handle...
            ptrChild = GetChildWindowHandle(ParentWindowHandle)

            Do Until ptrChild.Equals(IntPtr.Zero)
                'add to collection of handles...
                clsRet.Add(ptrChild)
                'get next child...
                ptrChild = GetNextWindowHandle(ptrChild)
            Loop

            'return...
            Return clsRet

        End Function

        Function GetChildWindowHandle(ByVal ParentWindowHandle As IntPtr) As IntPtr
            Return GetWindow(ParentWindowHandle, GW_CHILD)
        End Function

        Function GetNextWindowHandle(ByVal CurrentWindowhandle As IntPtr) As IntPtr
            Return GetWindow(CurrentWindowhandle, GW_HWNDNEXT)
        End Function

        'this function returns the text of the window, used so that we can confirm that we have the right dialog window...
        Function GetWindowText(ByVal WindowHandle As IntPtr) As String

            Dim ptrRet As IntPtr
            Dim ptrLength As IntPtr

            'get length for buffer...
            ptrLength = SendMessageA(WindowHandle, WM_GETTEXTLENGTH, IntPtr.Zero, IntPtr.Zero)

            'create buffer for return value...
            Dim sb As New System.Text.StringBuilder(ptrLength.ToInt32 + 1)

            'get window text...
            ptrRet = SendMessageString(WindowHandle, WM_GETTEXT, ptrLength.ToInt32 + 1, sb)

            'get return value...
            Return sb.ToString

        End Function

     

     

     

     

    2008年12月9日 3:53
    版主
  • Code Snippet

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

            Dim ptrDialogWindow As IntPtr = FindWindow(Nothing, "Windows Internet Explorer")

            Dim clsChildHandles As ArrayList = GetChildWindowHandles(ptrDialogWindow)

            For Each ptrHandle As IntPtr In clsChildHandles
                Dim str As String = GetWindowText(ptrHandle)
                If str <> "" And str <> "OK" Then
                    MsgBox(str)
                End If

            Next


        End Sub

     

     

     

    2008年12月9日 3:54
    版主
  •  

    非常感谢,搞定了这个问题。原来findwindow要精确匹配啊,一开始我用 internet竟然没找到,呵呵

     

    谢谢你了!!

    2008年12月11日 3:26