Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    prendere indirizzi da IE, Mozilla e Chrome [VB6]

    salve, ho un problemino con il browser di Google . . Chrome
    Il sequente breve codice in VB6 usa 3 labels e 1 bottone command
    che una volta cliccato mi dovrebbe mostrare gli indirizzi dei
    siti aperti in quel momento sui 3 browsers usati più comunemente.
    Ma mentre tutto funziona bene per Mozilla e Explorer, con Chrome
    non va.

    [IMG]

    AH . . dimenticavo . . funziona anche con Opera.
    Ho fatto una ricerca ed ho trovato che Chrome è molto diverso
    dagli altri browsers (problemi con dde) e le soluzioni alternative,
    anche abbastanza lunghe, mi portavano sempre su altri linguaggi
    di programmazione come C, vb.net ect . . dove non ho esperienza.

    Volevo quindi chiedere agli esperti che già in passato in questo
    forum mi hanno dato ottimi consigli, se davvero non esiste una
    soluzione semplice anche per VB6, mostrandomi, se possibile,
    qualche esempio . . GRAZIE

    ecco il codice usato nell'immagine:

    Private Sub Command1_Click()
    On Error GoTo command_error
    With Label1
    .Caption = ""
    .AutoSize = True
    .LinkTopic = "IExplore|WWW_GetWindowInfo"
    .LinkItem = "0xffffffff"
    .LinkMode = 2
    .LinkRequest
    End With
    DoEvents ' ---------
    With Label2
    .Caption = ""
    .AutoSize = True
    .LinkTopic = "firefox|WWW_GetWindowInfo"
    .LinkItem = "0xffffffff"
    .LinkMode = 2
    .LinkRequest
    End With
    DoEvents ' ---------
    With Label3
    .Caption = ""
    .AutoSize = True
    .LinkTopic = "Chrome|WWW_GetWindowInfo"
    .LinkItem = "0xffffffff"
    .LinkMode = 2
    .LinkRequest
    End With
    Exit Sub

    command_error:
    'try the next step on error
    Resume Next
    End Sub

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Se Chrome non lavora correttamente con DDE, prova a cercare la finestra con le API e ottieni il testo dall'editbox.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    ok . . grazie oregon per il consiglio ma speravo ci fosse qualche scorciatoia come quella che ho trovato per Mozilla ed Explorer.
    Pensa che, già da allora volevo seguire la strada che mi hai consigliato poi improvvisamente girogooglando ho trovato quel sistema semplicissimo ma che non si può usare con il Chrome.

    Comunque, visto che al momento non ci sono altre idee, procedo con le Api ma ho bisogno ancora di una mano.
    Con il codice seguente mi trovo l'handle che mi serve (e lo mostro nella Label1 insieme al nome della finestra del browser) della finestra di Google Chrome, ma ora sono bloccata e non trovo il successivo passaggio.
    Come arrivo all' editbox della barra degli indirizzi per leggere l'url che mi occorre?
    Ho ancora delle lacune sulla gestione dei componenti all'interno della finestra principale.
    Grazie

    - - - - - - - - - - - - - - - -

    'API Functions
    Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
    Private Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hwnd As Long) As Long
    Private Declare Function GetForegroundWindow Lib "user32" () As Long

    Dim title As String
    Dim handle As Long, length As Long

    Private Sub Timer1_Timer()
    handle = GetForegroundWindow
    length = GetWindowTextLength(handle)
    title = String(length, Chr$(0))
    GetWindowText handle, title, length + 1
    If InStr(UCase$(title), "GOOGLE CHROME") > 0 Then Beep
    Label1 = title + ">>" + Str$(handle) + "<<"
    End Sub

  4. #4
    rimembranze di vb6:
    ho preso una funzione che fà quello che chiedi, scritta in vb.net, dal sito di msdn social e l'ho trasformata in vb6...
    purtroppo non ho possibilità di provarla perchè qui ho montato Windows 2k e mi è impossibile installare Chrome.
    Il mio pc a casa si rifiuta categoricamente di eseguire programmi scritti con linguaggi dell'anteguerra...
    provalo, in caso di problemi chiedi.
    devi solo passare l'handle della finestra alla funzione. (mi pare che tu ce l'abbia già)
    codice:
    Declare Function SendMessage Lib "User32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal Msg As Long, wParam As Any, lParam As Any) As Long
    Declare Function FindWindowEx Lib "User32" (parentHandle As Integer, childAfter As Integer, className As String, windowTitle As String) As Integer
    Private Const WM_GETTEXTLENGTH As Integer = &HE
    Private Const WM_GETTEXT As Integer = &HD
    
    Public Function getChromeUrl(winHandle As Integer) As String
        Const nChars As Integer = 256
        Dim browserUrl As String
        Dim urlHandle As Integer
        Dim b As String
        Dim length As Integer
        browserUrl = ""
        length = SendMessage(urlHandle, WM_GETTEXTLENGTH, 0, 0)
        urlHandle = FindWindowEx(winHandle, 0, "Chrome_AutocompleteEditView", "")
        If length > 0 Then
            b = String(nChars, " ")
            SendMessage urlHandle, WM_GETTEXT, nChars, b
            browserUrl = b
        End If
        getChromeUrl = browserUrl
    End Function
    Bombardare per la pace, è come trombare per la verginità.

    C'è qualcuno al mondo che tromba troppo secondo me...

    Andrea Medici

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Usa questo codice

    http://www.vb-helper.com/howto_get_window_info.html

    per ottenere tutte le informazioni che vuoi a partire dall'handle della finestra principale di Chrome
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  6. #6
    ringraziando andreaciao ed oregon per le risposte, volevo dire che avevo già risolto
    stanotte verso le 2:00 . . proprio trovando e modificando lo stesso codice segnalato da oregon nel suo ultimo messaggio e adattandolo alle mie esigenze.

    In effetti ho capito che i browsers assegnano nomi divers al box testuale dove è contenuto l'url da prendere.

    Niente EditBox ma la versione di Chrome che sto usando adesso la chiama 'OmniBox' . . mentre il vecchio l'Explorer 6 che ho pure installato sul mio pc la chiama 'ComboBoxEx32'

    Insomma non ho trovato uno standard quindi ho paura che dovrò informarmi su come viene chiamata in tutte le versioni nuove e vecchie di Firefox, Explorer, Chrome e Opera . . ma per quelle future? . . . bho
    Oppure cercare in tutti i 'tiziocaiosempronioBox' una stringa che contenga un 'www' . . un 'http:' con slash vari . . . insomma qualcosa che assomigli ad un url.

    Provo il sistema di andrea che è un pò più compatto ma mi da uno sconosiuto errore di 'ingresso' quando cerca l'handle del Chrome_AutocompleteEditView che non so cosa sia.

    C'è ancora un problemino che devo risolvere. Se la pagina web è lunga da caricare, piena di plugins, animazioni, video ect . . spesso il codice si arrende e rinuncia a darmi l'url. Se invece la pagina è veloce tutto funziona bene. Dovrò inserire un ritardo nella ricerca.
    Ma per ora va bene così . . chissà che prima o poi passi di qui qualcuno con una nuova idea lampante.
    grazie

  7. #7
    prova questo (ti dava l'errore perchè non trovava l'API FindWindowEx nella User32, ora ho provato a passargli l'handle di un form e non dà più errori del genere).
    ho modificato anche il tipo della variabile che gli passi perchè l'handle può essere maggiore di quello che vb6 considera un intero.

    codice:
    Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal Msg As Long, wParam As Any, lParam As Any) As Long
    Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
    Private Const WM_GETTEXTLENGTH As Integer = &HE
    Private Const WM_GETTEXT As Integer = &HD
    
    Public Function getChromeUrl(winHandle As Long) As String
        Const nChars As Integer = 256
        Dim browserUrl As String
        Dim urlHandle As Integer
        Dim b As String
        Dim length As Integer
        browserUrl = ""
        length = SendMessage(urlHandle, WM_GETTEXTLENGTH, 0, 0)
        urlHandle = FindWindowEx(winHandle, 0, "Chrome_AutocompleteEditView", "")
        If length > 0 Then
            b = String(nChars, " ")
            SendMessage urlHandle, WM_GETTEXT, nChars, b
            browserUrl = b
        End If
        getChromeUrl = browserUrl
    End Function
    Altra soluzione sarebbe tramite Il programma Microsoft Spy++ andare a ricavarti il nome del controllo che usano loro. però come dici tu, se te lo cambiano tutte le volte sei punto e a capo.
    Bombardare per la pace, è come trombare per la verginità.

    C'è qualcuno al mondo che tromba troppo secondo me...

    Andrea Medici

  8. #8
    ok Andrea, adesso non ci sono errori e il codice completo che ho usato mischiando la prima parte della mia idea con la tua, è questo . . ma nella Label1 di controllo vedo solo il titolo della finestra del browser e non l'indirizzo . . perchè l'urlHandle resta sempre = 0
    Questo 'Chrome_AutocompleteEditView' . . .è proprio quello che dobbiamo cercare?

    codice:
    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal Msg As Long, wParam As Any, lParam As Any) As Long
    Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
    Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
    Private Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hwnd As Long) As Long
    Private Declare Function GetForegroundWindow Lib "user32" () As Long
    
    Private Const WM_GETTEXTLENGTH As Integer = &HE
    Private Const WM_GETTEXT As Integer = &HD
    
    Dim title As String
    Dim handle As Long, length As Long
    
    Private Sub Timer1_Timer() 
        '  intervallo impostato nelle proprietà a 300 millisecondi
        handle = GetForegroundWindow
        length = GetWindowTextLength(handle)
        title = String(length, Chr$(0))
        GetWindowText handle, title, length + 1
        If InStr(title, "Google Chrome") > 0 Then Label1 = title + ">>" + getChromeUrl(handle)
    End Sub
    
    Public Function getChromeUrl(winHandle As Long) As String
        Const nChars As Integer = 256
        Dim browserUrl As String
        Dim urlHandle As Integer
        Dim b As String
        Dim length As Integer
        browserUrl = ""
        length = SendMessage(urlHandle, WM_GETTEXTLENGTH, 0, 0)
        urlHandle = FindWindowEx(winHandle, 0, "Chrome_AutocompleteEditView", "")
        
       '  l' urlHandle non trova mai nulla <<<<<<<<<<<<<<<<<<<<<<
    
        If length > 0 Then
            b = String(nChars, " ")
            SendMessage urlHandle, WM_GETTEXT, nChars, b
            browserUrl = b
        End If
        getChromeUrl = browserUrl
    End Function

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Quel codice non è corretto ... controlla questo

    codice:
    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
    Private Declare Function GetWindow Lib "user32" (ByVal hWnd As Long, ByVal wCmd As Long) As Long
    Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hWnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
    Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
    Private Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hWnd As Long) As Long
    Private Declare Function GetForegroundWindow Lib "user32" () As Long
    
    Private Const GW_CHILD = 5
    Private Const GW_HWNDNEXT = 2
    Private Const WM_GETTEXT = &HD
    Private Const WM_GETTEXTLENGTH = &HE
    
    Dim title As String
    Dim handle As Long, length As Long
    
    Private Function WindowClass(ByVal hWnd As Long) As String
        Const MAX_LEN As Byte = 255
        Dim strBuff As String, intLen As Integer
        strBuff = String(MAX_LEN, vbNullChar)
        intLen = GetClassName(hWnd, strBuff, MAX_LEN)
        WindowClass = Left(strBuff, intLen)
    End Function
    
    Private Function WindowTextGet(ByVal hWnd As Long) As String
        Dim strBuff As String, lngLen As Long
        lngLen = SendMessage(hWnd, WM_GETTEXTLENGTH, 0, 0)
        If lngLen > 0 Then
            lngLen = lngLen + 1
            strBuff = String(lngLen, vbNullChar)
            lngLen = SendMessage(hWnd, WM_GETTEXT, lngLen, ByVal strBuff)
            WindowTextGet = Left(strBuff, lngLen)
        End If
    End Function
    
    Private Sub Timer1_Timer()
        handle = GetForegroundWindow
        length = GetWindowTextLength(handle)
        title = String(length, Chr$(0))
        GetWindowText handle, title, length + 1
        If InStr(title, "Google Chrome") > 0 Then
            handle = GetWindow(handle, GW_CHILD)
            Do Until handle = 0
                handle = GetWindow(handle, GW_HWNDNEXT)
                If WindowClass(handle) = "Chrome_OmniboxView" Then
                    Label1 = WindowTextGet(handle)
                    Exit Do
                End If
            Loop
        End If
    End Sub
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  10. #10
    bhe oregon, credo che questo sia PERFETTO e con la ricerca mirata nell''Omnibox . . anche l'ostico Google Crome è stato sconfitto.

    A prima vista mi è tutto chiaro tranne quello che sta fecendo la funzione WindowClass ma poi con calma me la studio meglio.

    Controllando continuamente con il Timer cosa c'è nella barra degli indirizzi tutto diventa più reattivo. Mi piace molto e ora provo ad adattarlo anche agli altri browser

    Correggimi se sbaglio, per le future versioni di Crome, se non verranno completamente stravolte, mi dovrebbe bastare fare un controllo del nome che daranno al box contenitore dell' URL e cercare il suo handle . . usando il codice del sito che abbiamo trovato . .

    (vedi http://www.vb-helper.com/howto_get_window_info.html )

    . . e che mi dava una mappa completa di tutti i componenti del browser indagato?

    grazie mille !!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.