2013-04-30 164 views
2

您好,我有这段代码可以在Chrome上获取当前网址,但只会获得活动标签网址。我需要使用UI Automation从所有打开的选项卡中获取URL。使用VB .Net和UI自动获取谷歌浏览器中所有打开的标签的网址

我的工作代码:

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 

,并在窗体的Load事件中使用此代码调用它:

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

不为我工作... – 2016-08-26 07:28:50

回答

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 

希望它能帮助:))))

+1

嗨!如果我可能会问先生,GetCurrentUrl函数有什么作用? – 2014-03-05 01:39:55

+0

对我来说根本不起作用,,,是不是有一种更简单的方法来做到这一点? – 2016-08-25 09:55:07

相关问题