使用VB .Net和UI Automation从Google Chrome中的所有打开的标签页获取网址

时间:2013-04-30 17:00:01

标签: vb.net ui-automation

您好我已经使用此代码在Chrome上获取当前网址,但只获取有效标签网址。我需要使用UI Automation从所有打开的选项卡中获取URL。

我的工作代码:

Function GetChromeUrl(ByVal proc As Process) As String
    If proc.MainWindowHandle = IntPtr.Zero Then
    Return Nothing
End If

Dim element As System.Windows.Automation.AutomationElement = AutomationElement.FromHandle(proc.MainWindowHandle)
If element Is Nothing Then
    Return Nothing
End If

Dim edit As System.Windows.Automation.AutomationElement = element.FindFirst(TreeScope.Children, New PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Edit))
Return (edit.GetCurrentPattern(ValuePattern.Pattern)).Current.Value.ToString
End Function

并在Form Load事件中使用此代码调用它:

For Each proc As Process In Process.GetProcessesByName("chrome")
    MsgBox(proc.MainWindowTitle + " " + GetChromeUrl(proc))
Next

1 个答案:

答案 0 :(得分:2)

你最好这样试试

Imports NDde.Client 'import the NDde library for firefox
Imports System.Runtime.InteropServices

'For Chrome
Private Const WM_GETTEXTLENGTH As Integer = &He
Private Const WM_GETTEXT As Integer = &Hd

<DllImport("user32.dll")> _
Private Shared Function SendMessage(hWnd As IntPtr, Msg As UInteger, wParam As Integer, lParam As Integer) As Integer
End Function
<DllImport("user32.dll")> _
Private Shared Function SendMessage(hWnd As IntPtr, Msg As UInteger, wParam As Integer, lParam As StringBuilder) As Integer
End Function
<DllImport("user32.dll", SetLastError := True)> _
Private Shared Function FindWindowEx(parentHandle As IntPtr, childAfter As IntPtr, className As String, windowTitle As String) As IntPtr
End Function

Public Shared Function getChromeUrl(winHandle As IntPtr) As String
    Dim browserUrl As String = Nothing
    Dim urlHandle As IntPtr = FindWindowEx(winHandle, IntPtr.Zero, "Chrome_AutocompleteEditView", Nothing)
    Const nChars As Integer = 256
    Dim Buff As New StringBuilder(nChars)
    Dim length As Integer = SendMessage(urlHandle, WM_GETTEXTLENGTH, 0, 0)
    If length > 0 Then
        SendMessage(urlHandle, WM_GETTEXT, nChars, Buff)
        browserUrl = Buff.ToString()

        Return browserUrl
    Else
        Return browserUrl
    End If

End Function

Public shared Function GetChromeHandle() As Intptr
 Dim ChromeHandle As IntPtr = Nothing
 Dim Allpro() As Process = Process.GetProcesses();
 For Each pro As Process in Allpro
  if pro.ProcessName = "chrome"
  ChromeHandle = pro.MainWindowHandle
  Exit For
  End if
 Next     
Return ChromeHandle
End Function

'USAGE FOR CHROME
 Dim CHandle As IntPtr = GetChromeHandle()
 If Not CHandle,Equals(Intptr.Zero)
 Dim url As String = getChromeUrl(CHandle)
 End If

Source and read more

编辑:

我找到了自己的方式并且它对我有用

Dim appAs String = "chrome"
Dim proc As System.Diagnostics.Process = GetBrowser(app)
...
Private Function GetBrowser(ByVal appName) As System.Diagnostics.Process
    Dim pList() As System.Diagnostics.Process =  
 System.Diagnostics.Process.GetProcessesByName(app)
    For Each proc As System.Diagnostics.Process In pList
        If proc.ProcessName = appThen
            Return proc
        End If
    Next
    Return Nothing
End Function

用法:

If proc IsNot Nothing Then
    Dim browserName as string = "Google Chrome"
    Dim className as String = "Edit" 
    Dim s As String = 
GetCurrentUrl(proc.MainWindowHandle, browserName, className, ComboBox1)
    If s <> "" Then
        Msgbox.show(s)
        ComboBox1.SelectedIndex = 0 'Window list
    Else

    End If
Else
    Label1.Text = browserName & " is not available"
end If

希望它有所帮助:))))

相关问题