locked
CAPTURAR URL: IE, FIREFOX E GOOGLE CHROME [VB.NET] RRS feed

  • Pergunta

  • Saudações a todos os colegas programadores VB.Net,

    Estou trabalhando em um programa encomendado por um cliente meu particular que este tem como uma das principais características capturar a url ativa dos principais navegadores de internet.

    Andei pesquisando sobre o assunto, e me deparei com este código.que pode ser visto através do seguinte link:

    http://social.msdn.microsoft.com/Forums/en-US/vbgeneral/thread/41fab2db-3c78-4501-9716-22a6a6aab8a2/

    entretanto só não entendi que código colocar no parâmetro da função principal GetCurrentUrl() onde o autor do tópico diz 

    "I simply call GetCurrentUrl(handle of the ie) and that's it."

    pelo visto é o manipulador da janela do IE (no caso), mas não estou conseguindo encontrar este parâmetro.

    Alguém poderia me dar uma força neste caso por favor? se possível gostaria também de saber em relação a este código, quais os parâmentros para o Chrome e Firefox.

    Brigadão galera! agradeço a todos que responderem. 

    sexta-feira, 19 de abril de 2013 14:34

Respostas

  • Falta o "THEN"... o correto é:

    If Not CHandle.Equals(IntPtr.Zero) Then

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    Sogi informatique ltée

    • Marcado como Resposta Giovani Cr sexta-feira, 18 de outubro de 2013 11:39
    terça-feira, 23 de abril de 2013 21:38
    Moderador
  • Faça assim:

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            'USAGE FOR CHROME
            Dim CHandle As IntPtr = GetChromeHandle()
            Dim url As String = ""
            If Not CHandle.Equals(IntPtr.Zero)
                 url  = getChromeUrl(CHandle) 
            End If
    
            TextBox1.Text =url 
        End Sub

    att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    Sogi informatique ltée

    • Marcado como Resposta Giovani Cr sexta-feira, 18 de outubro de 2013 11:39
    quarta-feira, 24 de abril de 2013 13:22
    Moderador
  • Flash,

    Eu ja respondi isso 3 vezes:

    >>  TextBox1.Text = getChromeUrl() ' <= aqui dentro desses parênteses pede o seguinte no auto complete do VB >>

    Dentro do parenteses você vai colocar o retorno da função GetChromeHandle()...

    Essa funcao procura por uma instancia do Chrome aberta e retorna seu Handle. Só que existe a possibilidade o chrome estar fechado por isso vc tem que verificar se o retorno é 0, por isso existe essa linha:

       If Not CHandle.Equals(IntPtr.Zero) Then

    Outro detalhe, você não usou o código que eu postei.. Se vc faz um Dim dentro de um "if" ele existe somente dentro dele.. note a diferença entre o código que eu propus e o seu:

    O Meu:

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            'USAGE FOR CHROME
            Dim CHandle As IntPtr = GetChromeHandle()
            Dim url As String = ""
            If Not CHandle.Equals(IntPtr.Zero)
                 url  = getChromeUrl(CHandle) 
            End If
    
            TextBox1.Text =url 
    End Sub

    o seu 

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            'USAGE FOR CHROME
            Dim CHandle As IntPtr = GetChromeHandle()
            If Not CHandle.Equals(IntPtr.Zero) Then
                Dim url As String = getChromeUrl(CHandle)
            End If
    
            TextBox1.Text = getChromeUrl()
        
    End Sub

    Use o código que eu propus.. aqui funciona

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    Sogi informatique ltée



    quinta-feira, 25 de abril de 2013 13:22
    Moderador
  • Eu usei o VS2012 sem problemas aqui. Voce ja aplicou os SPs? Eu recomendo VS2012 pra todo mundo  :D

    Quanto ao IE, eu vi este outro codigo:

    http://www.daniweb.com/software-development/vbnet/threads/351185/how-to-get-ie-address-bar-information-url

    Veja a ultima resposta do autor AndreRet.

    Note que tem que adicionar uma referencia pouco usual (microsoft.mshtml)

    Testando aqui eu nao consegui fazer funcionar com IE10. IE9 funciona. 6,7,8 eu nao tenho como testar.





    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    Sogi informatique ltée


    domingo, 28 de abril de 2013 11:06
    Moderador

Todas as Respostas

  • E este topico vc viu?

    http://social.msdn.microsoft.com/Forums/en-US/vbgeneral/thread/ca257f22-115e-43f2-a28d-c806c81061b7/

    A ultima resposta funciona, pelo menso pra mim.

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    Sogi informatique ltée

    sexta-feira, 19 de abril de 2013 15:56
    Moderador
  • Opa,

    consegui sim!, mas apenas para Firefox. Fiz assim pra testar >>

    TextBox1.Text = GetFirefoxUrl()

    e com relação ao trecho abaixo, não sei aí, mas aqui no meu VB 2008 deu erro dizendo que o Not não era uma expressão válida neste caso aí. Mas eu coloquei este code do jeito que está aí, sem ser dentro de nenhum evento de componente ou uma função criada. Ou seja copiei do jeito que foi postado lá. Daí quando eu retirei essa condição, compilou, mas não sei o que chamar lá pro TextBox. Pode ver que isso tá "solto" quando ao meu ver era pra estar englobado em uma função que aí sim quando chamasse ela em outra parte, mostraria o resultado desejado.

    'USAGE FOR CHROME

    Dim CHandle As IntPtr = GetChromeHandle()
     If Not CHandle,Equals(Intptr.Zero)
     Dim url AsString = getChromeUrl(CHandle)
     End If

    Com vc fez aí?

    Alguma dica?





    sábado, 20 de abril de 2013 14:42
  • Voce colocou exatamente deste jeito:

     If Not CHandle,Equals(Intptr.Zero)

    O certo é

     If Not CHandle.Equals(Intptr.Zero) Then
    
    End If

    É Ponto(.) e nao Virgula (,)

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    Sogi informatique ltée

    domingo, 21 de abril de 2013 00:54
    Moderador
  • Boa observação!

    mas mesmo assim não funfou. Faça o seguinte: me diga o que colocar no parâmetro da função principal de pegar a url do Chrome! que eu quero testar sem esse If aí.

    quando chamo a função,  pede isso:

    getChromeUrl(winHandle As IntPtr), só que não sei o "resultado" de (winHandle As intPtr), pra colocar dentro desses parênteses.

    Agradeço.

    segunda-feira, 22 de abril de 2013 21:04
  • É o handle da janela do chrome dado por esta funçao:

    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" Then
      ChromeHandle = pro.MainWindowHandle
      Exit For
      End If
     Next     
    Return ChromeHandle
    End Function

    depois é só usar:

     Dim CHandle As IntPtr = GetChromeHandle()
    Dim url As String="";
     If Not CHandle.Equals(Intptr.Zero) then
          url = getChromeUrl(CHandle)
     End If

    att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    Sogi informatique ltée



    segunda-feira, 22 de abril de 2013 23:45
    Moderador
  • Na verdade o que pede na hora de chamar a função principal é o seguinte:

    getChromeUrl(winHandle As IntPtr) 

    quando abro o parênteses me vem logo um "autocomplete" me pedindo isso (winHandle As IntPtr), então nesse caso seria o "resultado" disso (winHandle As IntPtr); para pôr entre parâmetro.

    Quer ver! testa aí! coloca todo código referente ao captura url do Chrome, e no final tenta chamar getChromeUrl( pra inserir num TextBox por exemplo, que aí verá com mais clareza o que me refiro.   

    Aguardo resposta.

    terça-feira, 23 de abril de 2013 15:09
  • Mais uma vez: o parametro que deve ser passado para funçao getChromeUrl é dado pela funçao:

    GetChromeHandle()

    Qual erro que voce recebe nesete trecho de codigo:

     Dim CHandle As IntPtr = GetChromeHandle()
    Dim url As String="";
     If Not CHandle.Equals(Intptr.Zero) then
          url = getChromeUrl(CHandle)
     End If

    ???

    att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    Sogi informatique ltée


    terça-feira, 23 de abril de 2013 15:28
    Moderador
  • Estes 3 primeiros referem-se ao trecho de código que vc citou acima.

    Error 1 Statement cannot appear outside of a method body/multiline lambda. c:\users\coder\documents\visual studio 2012\Projects\GetUrl\Form1.vb Line:55 Column: 2 GetUrl


    Error 2 Declaration expected. c:\users\coder\documents\visual studio 2012\Projects\GetUrl\Form1.vb Line: 56 Column: 7 GetUrl


    Error 3 'End If' must be preceded by a matching 'If'. c:\users\coder\documents\visual studio 2012\Projects\GetUrl\Form1.vb Line: 57 Column: 2 GetUrl

    Este aqui de baixo é onde chamo no Btn_Click para testar no TextBox como te falei acima.

    Error 4 Argument not specified for parameter 'winHandle' of 'Public Shared Function getChromeUrl(winHandle As System.IntPtr) As String'. c:\users\coder\documents\visual studio
     2012\Projects\GetUrl\Form1.vb Line: 70 Column: 25 GetUrl



    • Editado FLASHCODER terça-feira, 23 de abril de 2013 16:15
    terça-feira, 23 de abril de 2013 16:12
  • Poste seu codigo... eu nao obtenho nada disso aqui.

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    Sogi informatique ltée

    terça-feira, 23 de abril de 2013 17:16
    Moderador
  • Depois de várias tentativas eu consegui resolver aqui uma parte do problema Willian, o erro quanto aquele trecho condicional >>>

    'USAGE FOR CHROME
            Dim CHandle As IntPtr = GetChromeHandle()
            If Not CHandle.Equals(IntPtr.Zero)
                Dim url As String = getChromeUrl(CHandle)
            End If


    estava sendo porque esse trecho tinha que ficar dentro de algum evento, daí eu coloque pra testar assim >>>

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            'USAGE FOR CHROME
            Dim CHandle As IntPtr = GetChromeHandle()
            If Not CHandle.Equals(IntPtr.Zero)
                Dim url As String = getChromeUrl(CHandle)
            End If
    
            TextBox1.Text = getChromeUrl()
        End Sub


    Com isso agora só me falta saber o parâmetro o qual colocar 

    getChromeUrl(o que eu ponho aqui?)

    Olha o que me vem por causa disso:

    Error	1	Argument not specified for parameter 'winHandle' of 'Public Shared Function getChromeUrl(winHandle As System.IntPtr) As String'.	C:\Users\DESTRUCTOR\documents\visual studio 2012\Projects\GetUrl\Form1.vb	Line: 68	  Column: 25	GetUrl
    

    Talvez depois que eu colocar o argumento correto, definitivamente resolva este caso!

    Escreva apenas o que vc colocou aí como argumento agora pra ver se  dá certo aqui!

    Aguardo.


    • Editado FLASHCODER terça-feira, 23 de abril de 2013 20:04
    terça-feira, 23 de abril de 2013 19:59
  • Falta o "THEN"... o correto é:

    If Not CHandle.Equals(IntPtr.Zero) Then

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    Sogi informatique ltée

    • Marcado como Resposta Giovani Cr sexta-feira, 18 de outubro de 2013 11:39
    terça-feira, 23 de abril de 2013 21:38
    Moderador
  • já coloquei. E agora? qual seria o code do argumento?
    terça-feira, 23 de abril de 2013 21:42
  • Faça assim:

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            'USAGE FOR CHROME
            Dim CHandle As IntPtr = GetChromeHandle()
            Dim url As String = ""
            If Not CHandle.Equals(IntPtr.Zero)
                 url  = getChromeUrl(CHandle) 
            End If
    
            TextBox1.Text =url 
        End Sub

    att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    Sogi informatique ltée

    • Marcado como Resposta Giovani Cr sexta-feira, 18 de outubro de 2013 11:39
    quarta-feira, 24 de abril de 2013 13:22
    Moderador
  • Não funcionou,

    mas creio que o "formato" do código tem que ser daquela forma que te falei acima pra fazer funcionar>>

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            'USAGE FOR CHROME
            Dim CHandle As IntPtr = GetChromeHandle()
            If Not CHandle.Equals(IntPtr.Zero) Then
                Dim url As String = getChromeUrl(CHandle)
            End If
    
            TextBox1.Text = getChromeUrl() ' <= aqui dentro desses parênteses pede o seguinte no auto complete do VB >>
    
    (winHandle As System.IntPtr), 'mas lógico que não é pra colocar exatamente isso rsrs, mas sim algo relacionado com a janela do Google Chrome entende Willian? e é exatamente nisso que estou "travado" rsrs. 
        
    End Sub

    VC tinha me dito que tinha funcionado pra vc, mas se o código o qual vc colocou em seu projeto foi este dessa sua última resposta, com certeza não está funcionando! assino em baixo rs.

    Aguardo retorno.



    • Editado FLASHCODER quarta-feira, 24 de abril de 2013 22:13
    quarta-feira, 24 de abril de 2013 22:10
  • Flash,

    Eu ja respondi isso 3 vezes:

    >>  TextBox1.Text = getChromeUrl() ' <= aqui dentro desses parênteses pede o seguinte no auto complete do VB >>

    Dentro do parenteses você vai colocar o retorno da função GetChromeHandle()...

    Essa funcao procura por uma instancia do Chrome aberta e retorna seu Handle. Só que existe a possibilidade o chrome estar fechado por isso vc tem que verificar se o retorno é 0, por isso existe essa linha:

       If Not CHandle.Equals(IntPtr.Zero) Then

    Outro detalhe, você não usou o código que eu postei.. Se vc faz um Dim dentro de um "if" ele existe somente dentro dele.. note a diferença entre o código que eu propus e o seu:

    O Meu:

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            'USAGE FOR CHROME
            Dim CHandle As IntPtr = GetChromeHandle()
            Dim url As String = ""
            If Not CHandle.Equals(IntPtr.Zero)
                 url  = getChromeUrl(CHandle) 
            End If
    
            TextBox1.Text =url 
    End Sub

    o seu 

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            'USAGE FOR CHROME
            Dim CHandle As IntPtr = GetChromeHandle()
            If Not CHandle.Equals(IntPtr.Zero) Then
                Dim url As String = getChromeUrl(CHandle)
            End If
    
            TextBox1.Text = getChromeUrl()
        
    End Sub

    Use o código que eu propus.. aqui funciona

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    Sogi informatique ltée



    quinta-feira, 25 de abril de 2013 13:22
    Moderador
  • Willian, vc tinha razão; seu código funciona mesmo, o problema aqui era o VS2012 bugado. Essa versão ainda tem que ser muito melhorada, está cheia de bugs grosseiros. Tive que passar todo o projeto pra o VS2010. No 2010 funciona perfeitamente. Não recomendo o VS2012 pra ninguém.

    Em relação a url no IE, vc teve sucesso com o link sugerido pelo cara?

    Vou tentar converter aqui pra VB.Net pra ver se consigo.

    Valeu


    • Editado FLASHCODER sábado, 27 de abril de 2013 14:15
    sábado, 27 de abril de 2013 14:14
  • Eu usei o VS2012 sem problemas aqui. Voce ja aplicou os SPs? Eu recomendo VS2012 pra todo mundo  :D

    Quanto ao IE, eu vi este outro codigo:

    http://www.daniweb.com/software-development/vbnet/threads/351185/how-to-get-ie-address-bar-information-url

    Veja a ultima resposta do autor AndreRet.

    Note que tem que adicionar uma referencia pouco usual (microsoft.mshtml)

    Testando aqui eu nao consegui fazer funcionar com IE10. IE9 funciona. 6,7,8 eu nao tenho como testar.





    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    Sogi informatique ltée


    domingo, 28 de abril de 2013 11:06
    Moderador
  • É, funciona só nos IE antecessores ao 10, testei aqui até a versão 6 do IE.

    Valeu Willian pela sua grandiosa ajuda, valeu mesmo cara! Não respondi logo, porque estava muito ocupado.

    Dou-lhe este tópico por encerrado. 

    sexta-feira, 17 de maio de 2013 13:00
  • Ok. Neste caso, marque a (ou as) resposta que mais te ajudaram... isso automaticamente encerra o topico.

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    Sogi informatique ltée

    sexta-feira, 17 de maio de 2013 16:30
    Moderador
  • Sir William,

    Estou tentado utilizar o código mencionado e tenho passado por problemas:

    Para todos os executáveis do "chrome" eu obtenho um Handle = 0 neste trecho:

    Dim urlHandle As IntPtr = FindWindowEx(winHandle, IntPtr.Zero, "Chrome_AutocompleteEditView", Nothing)

    Mesmo o winHandle não sendo 0, o valor do urlHandle está sempre vindo 0. Ou seja, não está encontrando a janela da URL dentro da janela principal do Chrome, por este nome.

    Meu Chrome é versão 30.0.1599.101, testei tanto no Windows XP no VS2008 quanto no Windows 7 64bits no VS2012.

    Veja o código na íntegra:

    Imports System.Runtime.InteropServices
    Imports System.Text
    Imports System.Diagnostics
    
    Public Class Form1
    
        <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
    
        Private Const WM_GETTEXTLENGTH As Integer = &HE
        Private Const WM_GETTEXT As Integer = &HD
    
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            Dim CHandle As IntPtr = GetChromeHandle()
            Dim url As String = getChromeUrl(CHandle)
            Debug.WriteLine(url)
        End Sub
    
    
        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()
            End If
            Return browserUrl
        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" Then
                    If pro.MainWindowHandle.ToInt64 > 0 Then
                        ChromeHandle = pro.MainWindowHandle
                        Exit For
                    End If
                End If
            Next
            Return ChromeHandle
        End Function
    
    End Class


    Obrigado pela ajuda.

    sexta-feira, 18 de outubro de 2013 01:39