2

您好,我有这段代码可以在 Chrome 上获取当前网址,但只能获取活动标签网址。我需要使用 UI 自动化从所有打开的选项卡中获取 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

并在表单加载事件中使用此代码调用它:

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

1 回答 1

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

来源并阅读更多

编辑 :

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

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

希望能帮助到你 :))))

于 2013-06-01T13:04:08.383 回答