IE Url Leiste



  • Hi,
    hab da immer noch Probleme mit.
    Will doch nur auslesen was da drin steht.
    Der Weg von Nemesis hat nicht wirklich funktioniert.
    Wieso funzt das Handel auf das Element nicht so...grml

    Hat jemand noch eine Idee?

    Weiß echt nicht mehr weiter

    danke



  • Dann nimm statt GetWindowText, SendMessage & WM_GETTEXT.

    MSDN schrieb:

    To retrieve the text of a control in another process, send a WM_GETTEXT message directly instead of calling GetWindowText.



  • hi,
    hab nen delphi code gefunden und soweit angepasst.

    long url;
    HWND child;
    HWND ie; 
    if(ie = ::FindWindow("IEFrame",buff))
    {
    	if(child = ::FindWindowEx(ie,0,"WorkerW",0))
    	{
    		if(child = ::FindWindowEx(child,0,"ReBarWindow32",0))
    		{
    			if(child = ::FindWindowEx(child,0,"ComboBoxEx32",0))
    			{
    				::SendMessage(child,WM_GETTEXT,255,url);
    				::SetWindowText(child,"test");
    				CString test;
    				test.Format("%l",url);
    				//AfxMessageBox(test);
    			}
    		}
    	}
    }
    

    Krieg auch nen Wert in url zurück, aber wie kann ich ihn jetzt gescheit umwandeln? so wie es da jetzt steht, schmeisst er mich beim format raus.

    wie konvertiere ich am besten?



  • jaja ich weiss deus lach dich ruhig tot 😉 (insider aus dem icq)

    aber dank deus hab ich es jetzt doch noch hinbekommen (augen aufhalt muss)

    ::SendMessage(child,WM_GETTEXT,255,(long)&buffer[0]);
    

    so damit funzt es nu....



  • so, hab jetzt ne vernünftige mfc lösung gefunden denk ich 🙂

    Man kann ein aktuelles Browserfenster Steuern:

    + aktuelle URL auslesen
    + neue URL senden

    mal schauen, entweder mach ich nur nen FAQ Eintrag fertig oder wenn ich zeit finde, schreib ich ne eigene kleine Klasse dafür!

    Gruss
    chris



  • Dann kriegste von mir nen Orden! Url auslesen suche ich schon seit Jahren... 👍



  • du meinst doch die,die in der leiste drin steht oder? als von der sprach ich jetzt 🙂

    für dich vorab:

    CString titel = "\1:blank - Microsoft Internet Explorer";
    
    char buffer[256];
    HWND child;
    HWND ie; 
    if(ie = ::FindWindow("IEFrame",titel))
    {
        if(child = ::FindWindowEx(ie,0,"WorkerW",0))
    	{
    		if(child = ::FindWindowEx(child,0,"ReBarWindow32",0))
    		{
    			if(child = ::FindWindowEx(child,0,"ComboBoxEx32",0))
    			{
    				::SendMessage(child,WM_GETTEXT,255,(long)&buffer[0]);
                    CString tmp = &buffer[0];
    				AfxMessageBox(tmp);
    			}
    		}						
    	}
    }
    

    That´s it



  • Danke! 🙂

    Wird bei Gelegenheit ausprobiert.

    Sehe ich das richtig, dass titel die "Beschriftung" des Fensters ist? Also dummerweise variieren kann? 😕



  • In dieser Variante ja!

    Wie möchtest du es denn gelöst haben? Alle IE Instancen??
    Sag mir wie, ich hab mitlerweile hier ein paar lösungen für alle mögliche Variationen liegen 🙂



  • Alle IE Instancen ist schon prima (sollte sich ja auf Opera umbauen lassen...).

    Ich hab halt eine Datenbank zu Hause, wo ich per Programm einen Link einpflegen können will, der gerade offen ist.
    Aufruf des Programms per Schnellstartleiste und wenn es nur ein Fenster ist, wird dann eben das genommen, bei mehreren gibts ne Auswahl. (So sieht der Entwurf im Kopf gerade aus.)



  • Ok,
    also da gäbs folgende Variante :
    Zu ersteinmal eine CallBack Funktion

    //Header
    protected: 
        static BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam); 
    
    //Quellcode
    BOOL CALLBACK CDeinDlg::EnumWindowsProc(HWND hwnd, LPARAM lParam)
    {
    	static char cbuff[256]="\0";
    	static CString strClass, buff;
    	static DWORD dwPID=0;
    
    	// get window class name
    	::GetClassName(hwnd, strClass.GetBuffer(_MAX_PATH), _MAX_PATH);
    
    	// get pid
    	::GetWindowThreadProcessId(hwnd, &dwPID);
    
    	// get caption
    	::GetWindowText(hwnd, cbuff, sizeof(cbuff));
    
    	buff.Format("%s",cbuff);
    
    	// In buff stehen nun alle offnen Fenster drin
        // Du musst nun einfach die Rausfiltern die MIE oder halt Opera
        // Im Titel haben
        // mit if und find arbeiten  
    	return true;
    }
    
    // Der Aufruf der Callback Funktion
    ::EnumChildWindows(::GetDesktopWindow(),EnumWindowsProc, (LPARAM)this);
    

    So das hätten wir.... Nun kannst du hingehen und die von mir beschriebene IE Variante ausführen. Wenn deine Fenster ausgewählt ist, das hwnd übergeben..

    Für Opera müsste man jetzt nur die Funktion anpassen, die auf die Combo zugreift. Das dürfte ja aber nicht so schwer sein.

    Man kann jetzt hingehen und das für alle Browser machen (man muss halt nur alle einmal durch gegangen sein)

    Und so wies aussieht, muss man halt drauf achten, das man die ComboBox nimmt und nicht das Edit (zumindest beim IE)...

    alles verstanden? 🙂

    Headereintrag ergänzt



  • Wow, danke!

    Das wird in der Mittagspause mal ausprobiert. 😃



  • C-O-M-M-A-N-D-E-R schrieb:

    du meinst doch die,die in der leiste drin steht oder? als von der sprach ich jetzt 🙂

    für dich vorab:

    CString titel = "\1:blank - Microsoft Internet Explorer";
    	
    char buffer[256];
    HWND child;
    HWND ie; 
    if(ie = ::FindWindow("IEFrame",titel))
    {
        if(child = ::FindWindowEx(ie,0,"WorkerW",0))
    	{
    		if(child = ::FindWindowEx(child,0,"ReBarWindow32",0))
    		{
    			if(child = ::FindWindowEx(child,0,"ComboBoxEx32",0))
    			{
    				::SendMessage(child,WM_GETTEXT,255,(long)&buffer[0]);
                    CString tmp = &buffer[0];
    				AfxMessageBox(tmp);
    			}
    		}						
    	}
    }
    

    That´s it

    Mrmmh...
    Irgentwas geht da nicht... Was brauch man dafür noch so für header?
    Wär echt nett, wenn du mal ein compilirbares Beispiel posten könntest!!!! 👍 👍 👍

    M.f.G.
    Canon 🙂



  • Wäre vielleicht hilfreicher wenn du uns mitteilst, was für einen Fehler du bekommst? Diese Lösung ist so fertig kompilierbar!



  • Hi!

    Ich hab einfach die Callbackfunktion rauskopiert in mein Projekt und auch den Aufruf genauso übernommen.

    Aber beim Kompilieren gibt es einen Fehler: 😞

    E:\Favo\FavoDlg.cpp(47) : error C2664: 'EnumChildWindows' : Konvertierung des Parameters 2 von 'int (struct HWND__ *,long)' in 'int (__stdcall *)(struct HWND__ *,long)' nicht moeglich
            Keine Funktion mit diesem Namen im Gueltigkeitsbereich stimmt mit dem Zieltyp ueberein
    

    Da du für den Header nichts geschrieben hast, hab ich das wie bei allen anderen Funktionen auch gemacht:

    BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam);
    

    Is das okay so? Von Callback-Funktionen habe ich leider bisher überhaupt keine Ahnung. 😞

    Was ist falsch? 😕
    Danke!



  • axo ups vergessen:

    protected:
      static BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam);
    

    so schauts aus 🙂



  • Danke, jetzt kompilierts - dann kann ich nachher weiterbasteln. 🙂



  • 👍 kein problem 🙂



  • Ich nochmal. 😞

    Mit statischen Variablen hab ich noch so ein Problem. Ich kriege folgende Meldung:

    FavoDlg.obj : error LNK2001: Nichtaufgeloestes externes Symbol "protected: static class CStringArray CFavoDlg::s_arrUrls" (?s_arrUrls@CFavoDlg@@1VCStringArray@@A)
    Debug/Favo.exe : fatal error LNK1120: 1 unaufgeloeste externe Verweise

    Da muss bestimmt noch was ins cpp, aber was? Im Header steht

    static CStringArray s_arrUrls;
    

    Da drin will ich die Urls speichern um sie schließlich in einer Listbox anzeigen zu lassen.
    Oder gibt es einen anderen Weg, die Urls in der Listbox anzeigen zu lassen?
    Mit GetDlgItem darf ich ja auch nicht arbeiten. 😞

    Danke!



  • Auch da haben wir für dich ne lösung:
    ergänze das in der CallBack

    CDeinDlg* dlg=(CDeinDlg*)lParam;
    

    Und schon kannste via "dlg->" auf deine Elemente zugreifen...


Log in to reply