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

ui-automationvb.net

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.

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:

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

Best Solution

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 :))))

Related Question