• 如何得到webbrowser的句柄


    webbrowser不能通过webbrowser.hwnd 来获得句柄,上网查询之后在microsoft网站中看到了应该用遍历所以控件并查看其classname是否是shell embedding的方法来获得,而实际装载网页的并不是它本身。webbrowswer的下一层子窗口是Shell DocObject View,再下一层是Internet Explorer_Server,Internet Explorer_Server才是真正装载网页的“窗口”。以下是一个例子:

    '画一个webbrowser1和一个command1

    Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
    Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long
    Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long

    Private Const GW_CHILD = 5
    Private Const GW_HWNDNEXT = 2

    Dim hwndWebB As Long

    Private Sub Command1_Click()
        fGetWebBHwnd Form1.hwnd
    End Sub

    Private Sub Form_Load()
        WebBrowser1.Navigate2 "http://hi.baidu.com/spongeyu"
    End Sub

    Private Sub WebBrowser1_DownloadComplete()
        If hwndWebB = 0 Then
            hwndWebB = fGetWebBHwnd(Me.hwnd)
            Debug.Print "hwndWebB=" & hwndWebB
        End If
    End Sub

    '获得webbrowser的最上层子控件Internet Explorer_Server的句柄
    Public Function fGetWebBHwnd(hwndParent As Long) As Long
        Dim hwndChild1 As Long
        Dim hwndChild2 As Long
        Dim hwndChild3 As Long
        Dim classChild1
        Dim classChild2
        Dim classChild3
        Dim sClassname1 As String * 256
        Dim sClassname2 As String * 256
        Dim sClassname3 As String * 256
       
        '第一子层
        hwndChild1 = GetWindow(hwndParent, GW_CHILD)
        Debug.Print "hwnd=" & hwndChild1
        classChild1 = GetClassName(hwndChild1, sClassname1, 256)
        Debug.Print "classsname=" & sClassname1
        If Left(sClassname1, Len("Shell Embedding")) <> "Shell Embedding" Then
            Do
                hwndChild1 = GetWindow(hwndChild1, GW_HWNDNEXT)
                Debug.Print "hwnd=" & hwndChild1
                classChild1 = GetClassName(hwndChild1, sClassname1, 256)
                Debug.Print "classsname=" & sClassname1
                If Left(sClassname1, Len("Shell Embedding")) = "Shell Embedding" Then
                     Exit Do
                End If
                DoEvents
            Loop While hwndChild1 <> 0
        End If
        '第二子层
        If hwndChild1 <> 0 Then
            hwndChild2 = GetWindow(hwndChild1, GW_CHILD)
            Debug.Print "hwnd=" & hwndChild2
            classChild2 = GetClassName(hwndChild2, sClassname2, 256)
            Debug.Print "classsname=" & sClassname2
            If Left(sClassname2, Len("Shell DocObject View")) <> "Shell DocObject View" Then
                Do
                    hwndChild2 = GetWindow(hwndChild2, GW_HWNDNEXT)
                    Debug.Print "hwnd=" & hwndChild2
                    classChild2 = GetClassName(hwndChild2, sClassname2, 256)
                    Debug.Print "classsname=" & sClassname2
                    If Left(sClassname2, Len("Shell DocObject View")) = "Shell DocObject View" Then
                         Exit Do
                    End If
                    DoEvents
                Loop While hwndChild2 <> 0
            End If
        End If
        '第三子层
        If hwndChild2 <> 0 Then
            hwndChild3 = GetWindow(hwndChild2, GW_CHILD)
            Debug.Print "hwnd=" & hwndChild3
            classChild3 = GetClassName(hwndChild3, sClassname3, 256)
            Debug.Print "classsname=" & sClassname3
            If Left(sClassname3, Len("Internet Explorer_Server")) <> "Internet Explorer_Server" Then
                Do
                    hwndChild3 = GetWindow(hwndChild3, GW_HWNDNEXT)
                    Debug.Print "hwnd=" & hwndChild3
                    classChild3 = GetClassName(hwndChild3, sClassname3, 256)
                    Debug.Print "classsname=" & sClassname3
                    If Left(sClassname3, Len("Internet Explorer_Server")) = "Internet Explorer_Server" Then
                         Exit Do
                    End If
                    DoEvents
                Loop While hwndChild3 <> 0
            End If
        End If
        If hwndChild3 <> 0 Then
            fGetWebBHwnd = hwndChild3
        Else
            fGetWebBHwnd = 0
        End If
    End Function

    另外还有一种简便的方法:

    Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long

    Private Function fGetWebBHwnd1(hwndParent As Long) As Long
        Dim lngHwnd As Long
        lngHwnd = FindWindowEx(hwndParent, 0, "Shell Embedding", vbNullString)
        lngHwnd = FindWindowEx(lngHwnd, 0, "Shell DocObject View", vbNullString)
        lngHwnd = FindWindowEx(lngHwnd, 0, "Internet Explorer_Server", vbNullString)
        If lngHwnd <> 0 Then
            fGetWebBHwnd1 = lngHwnd
        Else
            fGetWebBHwnd1 = 0
        End If
    End Function

  • 相关阅读:
    Mysql 数据库 表中列的操作
    FreeSWITCH版本更新
    shell脚本58问
    Wireshark 与 Tcpdump
    Mysql 中 int(3) 和 int(11) 的区别
    FreeSWITCH 基础
    FreeSWITCH 学习笔记(一)
    Mysql 复制表数据(表结构相同)
    Centos date 设置自定义时间
    Mysql 主键
  • 原文地址:https://www.cnblogs.com/niuniu502/p/1848693.html
Copyright © 2020-2023  润新知