Click here to Skip to main content
15,848,451 members
Please Sign up or sign in to vote.
1.00/5 (2 votes)
See more:
Hello,
I did a code to get the active url from IE browser.
C#
Public Class Form2
    Private Function GetBrowser(ByVal appName) As System.Diagnostics.Process

        Dim plist As System.Diagnostics.Process() = System.Diagnostics.Process.GetProcessesByName(appName)
        'Dim remoteByName As System.Diagnostics.Process() = System.Diagnostics.Process.GetProcessesByName(appName)
        For Each proc As System.Diagnostics.Process In plist
            For i As Integer = 1 To plist.Length

                If proc.ProcessName = appName Then
                    Return proc
                End If

            Next
        Next
        Return Nothing
    End Function

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim appName As String = "iexplore"
        Dim proc As System.Diagnostics.Process = GetBrowser(appName)
        If proc IsNot Nothing Then
            Dim browserName As String = "Windows Internet Explorer"
            Dim className As String = "Edit"
            Dim Label1 As String = "Label1"
            Dim curl As New currenturl1()
            Dim s As String = curl.GetCurrentUrl(proc.MainWindowHandle, browserName, className, Label1)
            If s <> "" Then
                MessageBox.Show(s)
            Else
                MessageBox.Show("url not found")
            End If
        Else

        End If

    End Sub
End Class


And I make a class to call the function GetCurrentUrl, which is


C#
Imports System.Text
Imports System.Runtime.InteropServices.Marshal

'Option Explicit On


Public Class currenturl1


#Region " Overview & References "
    'Overview:
    'Function GetCurrentUrl returns the URL of the selected browser (IE or Chrome; Firefox to be added). 
    'Most of the code is based on the references listed below, but this function starts with
    'the browser's main window handle and returns only 1 URL. 
    'It also builds a simple "treeview" of the windows up to the target window's classname.

    'References: 
    'http://www.xtremevbtalk.com/archive/index.php/t-129988.html
    'http://social.msdn.microsoft.com/forums/en-us/vbgeneral/thread/321D0EAD-CD50-4517-BC43-29190542DCE0
    'http://social.msdn.microsoft.com/Forums/en/vbgeneral/thread/02a67f3a-4a26-4d9a-9c67-0fdff1428a66

#End Region

#Region " Declares, Constants, and Variables"
    Private Delegate Function EnumProcDelegate(ByVal hwnd As IntPtr, ByVal lParam As IntPtr) As Boolean 'Delegate added
    Private Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As EnumProcDelegate, ByVal lParam As IntPtr) As Boolean
    Private Declare Auto Function GetWindowText Lib "user32" (ByVal hWnd As IntPtr, ByVal lpString As StringBuilder, ByVal nMaxCount As Integer) As Integer
    Private Declare Function GetWindow Lib "user32" (ByVal hwnd As IntPtr, ByVal wCmd As IntPtr) As IntPtr
    Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As IntPtr, ByVal lpClassName As String, ByVal nMaxCount As Integer) As Integer
    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As IntPtr, ByVal wMsg As IntPtr, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As Integer

    Private Const WM_GETTEXT = &HD
    Private Const WM_GETTEXTLENGTH = &HE

    Private Const GW_CHILD = 5
    Private Const GW_HWNDNEXT = 2
    Private Const GW_HWNDFIRST = 0

    Private sURL As String 'String that will contain the URL
    Private cbWindows As String 'Treeview" 
    Private sIndent As String 'Spaces
    Private sBrowser As String 'Starting window (IE or Chrome)
    Private sClassName As String = "Edit" 'Default
#End Region

    Public Function GetCurrentUrl(ByVal hwnd As IntPtr, ByVal browser As String, ByVal classname As String, ByVal combo As String) As String
        sBrowser = browser
        sClassName = classname
        cbWindows = combo
        If cbWindows IsNot Nothing Then
            If cbWindows.GetType.Name = "Label1" Then
                ' cbWindows.Items.Clear()
            Else
                cbWindows = Nothing
            End If
        End If
        sURL = ""
        sIndent = ""
        EnumWindows(AddressOf EnumProc, hwnd) 'hwnd - originally IntPtr.Zero
        Return sURL
    End Function

    ' Enumerate the windows
    ' Find the URL in the browser window 
    Private Function EnumProc(ByVal hWnd As IntPtr, ByVal lParam As IntPtr) As Boolean
        Dim buf As StringBuilder = New StringBuilder(256) 'String * 1024
        Dim title As String
        Dim length As Integer

        ' Get the window's title.
        length = GetWindowText(hWnd, buf, buf.Capacity)
        title = Left(buf.ToString, length)

        ' See if the title ends with the browser name 
        Dim s As String = "Internet Explorer"
        Dim inprivate = sBrowser & " - [InPrivate]"  'IE adds this to the window title
        If title <> "" Then
            'If (Right(title, s.Length) = s) Or (Right(title, inprivate.Length) = inprivate) Then
            '    ' This is it. Find the URL information.
            'sURL = EditInfo(hWnd, cbWindows)
            'Return False
            'End If
            If (title.Contains(s)) Then
                ' This is it. Find the URL information.
                sURL = EditInfo(hWnd, cbWindows)
                Return False
            End If
        End If
        'Continue searching
        Return True

    End Function

    ' If this window is of the Edit class (IE) or Chrome_AutocompleteEditView (Google), return its contents. 
    ' Otherwise search its children for such an object.
    Private Function EditInfo(ByVal window_hwnd As IntPtr, ByRef cbWindows As String) As String
        Dim txt As String = ""
        Dim buf As String
        Dim buflen As Integer
        Dim child_hwnd As IntPtr
        Dim children() As IntPtr = {}
        Dim num_children As Integer
        Dim i As Integer

        'Get the class name.
        buflen = 256
        buf = Space(buflen - 1)
        buflen = GetClassName(window_hwnd, buf, buflen)
        buf = Left(buf, buflen)

        'Add an item to the window list combo, indent as required
        If cbWindows IsNot Nothing Then
            'cbWindows.Items.Add(sIndent & buf)
        End If
        ' See if we found an Edit/AutocompleteEditView object.
        If buf = sClassName Then
            Return WindowText(window_hwnd)
        End If


        ' It's not an Edit/AutocompleteEditView object. Search the children.
        ' Make a list of the child windows.
        num_children = 0
        child_hwnd = GetWindow(window_hwnd, GW_CHILD)
        While child_hwnd <> 0
            num_children = num_children + 1
            ReDim Preserve children(0 To num_children) 'was 1 to ..
            children(num_children) = child_hwnd
            child_hwnd = GetWindow(child_hwnd, GW_HWNDNEXT)
        End While

        ' Get information on the child windows.
        sIndent &= "    "
        For i = 1 To num_children
            txt = EditInfo(children(i), cbWindows)
            If txt <> "" Then Exit For
        Next i
        sIndent = Left(sIndent, sIndent.Length - 4)

        Return txt
    End Function

    ' ************************************************
    ' Return the text associated with the window.
    ' ************************************************
    Private Function WindowText(ByVal window_hwnd As IntPtr) As String
        Dim txtlen As Integer
        Dim txt As String

        txt = "" 'WindowText = ""
        If window_hwnd = 0 Then Return "" 'Exit Function

        'Get the size of the window text
        txtlen = SendMessage(window_hwnd, WM_GETTEXTLENGTH, 0, 0)
        If txtlen = 0 Then Return "" 'Exit Function

        'Extra for terminating char
        txtlen = txtlen + 1

        'Alloc memory for the buffer that recieves the text
        Dim buffer As IntPtr = AllocHGlobal(txtlen)

        'Send The WM_GETTEXT Message
        txtlen = SendMessage(window_hwnd, WM_GETTEXT, txtlen, buffer) 'byval txt 

        'Copy the characters from the unmanaged memory to a managed string
        txt = PtrToStringAnsi(buffer)
        Return Left(txt, txtlen)
    End Function

End Class

But I am getting an issue here is that it sometimes returning the url and sometimes not. So what I need to change in the code. Its urgent, please help me.

Thanks,
Posted
Updated 18-Jun-14 3:45am
v2
Comments
ZurdoDev 18-Jun-14 8:33am    
You need to debug it.
Priyanka Bhawsar 18-Jun-14 9:21am    
Yes I debugged it and i found when the window does not found then the control does not go in inside this loop(While child_hwnd <> 0) but why its not going inside it, I am unable to find that.
ZurdoDev 18-Jun-14 9:45am    
Why doesn't it find the window?
Sergey Alexandrovich Kryukov 18-Jun-14 13:13pm    
Why? :-)
—SA
Sergey Alexandrovich Kryukov 18-Jun-14 13:13pm    
Bad approach. You are trying to collaborate with external process which is not designed for such collaboration. And what's the use even if you succeed? IE is not the only browser.
I don't know your goals, but you could, say, embed a Web browser in your UI application, which would be quite easy.

If you want some advice/help, you need to explain your ultimate goals.

—SA

1 solution

HttpRequest.RawUrl Property
check out this one
 
Share this answer
 

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900