IE Url Leiste
-
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 VerweiseDa 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 CallBackCDeinDlg* dlg=(CDeinDlg*)lParam;
Und schon kannste via "dlg->" auf deine Elemente zugreifen...
-
Danke, das funktioniert super!
(Hätt ich ja auch mal drauf kommen können, aber das hab ich noch nicht oft genug gemacht.)Jetzt hab ich meine Liste. Nun sollte ich aber wirklich alleine klar kommen. Ist ja nur noch Dialoggeraffel und ein wenig Datenbankzugriff.
Vielen Dank nochmal!
-
Gerne, kein Problem
wenn du weiter probs hast, hier posten *g*
-
Das geht doch alles nicht...
Ich mach bestimmt was falsch...
Ich will daraus doch nur ein ganz einfaches Programm machen,
nur die 'main' Funktion, da sollte dann alles drinstehen...
ich hab das mal einfach darein kopiert. aber so geht das nichtvoid main () { 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); } } } } }
Vieleicht stell ich mich ja zu doof an, aber da kommen 1001 fehler
WARUM FUNKTIONIERT DAS NICHT???was brauch man überhaupt noch für *.h Dateien???
Bitte helft mir!
-
Hast du eine MFC Anwendung erstellt?
-
Ach gut, da hab ich garnich drauf geachtet...
Ich kann nur n bischen Konsole. Kann man das auch über die Konsole machen?
-
das geht bestimmt auch über die konsole,
aber da kannstenatürlich nicht solche sachen wie die MessageBox etc. nutzen (es sein denn deine konsole hat mfc unterstützung) hab das so noch nie gemacht...werds mal eben testen