如何得到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

转载于:https://www.cnblogs.com/niuniu502/archive/2010/10/12/1848693.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值