vb.net 使用 VB .Net 和 UI 自动化从 Google Chrome 中所有打开的标签中获取 url

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/16305238/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-17 13:26:04  来源:igfitidea点击:

Get url from all open tabs in Google Chrome using VB .Net and UI Automation

vb.netui-automation

提问by jgiunta

Hello I have this code working to get current url on Chrome, but only get active tab url. I need to get url from all open tabs using UI Automation.

你好,我有这段代码可以在 Chrome 上获取当前 url,但只能获取活动标签 url。我需要使用 UI 自动化从所有打开的选项卡中获取 url。

My working code:

我的工作代码:

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

and call it using this code in Form Load event:

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

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

回答by Shim

you better try this way

你最好试试这个

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

来源和阅读更多

EDIT :

编辑 :

i found my own way and it worked for me

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

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

usage :

用法 :

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

hope it helps :))))

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