Programm ausführen nach beenden des Internet Explorers
-
Sag mal,womit hast du eigentlich die Sockets programmiert?Ich hab den Eindruck du solltest dich mal mit der Materie beschäftigen.
Entweder willst du programmieren(dann aber auch vernünftig) oder du lädst dir irgendwo nen Programm runter dass das kann was du möchtest.
Frag doch mal MagicCreator ob er dir gegen Bezahlung dein Prog schreibt,was anderes macht er zur Zeit ja auch nicht.
:pMfG Spacelord
-
du brauchst kein keyboardhook sondern ein messagehook: WH_CALLWNDPROC...
-
@Spacelord:
Winapi an zwei Tagen oder was (ich brauchs möglichst schnell)???Was Sockets angeht: Das is ja wirklich total billig. Ich programmier ja auch schon länger, nur halt Konsole (und unter Linux). Nu brauch ich aber mal ein Prog für Windows. Und wenn du mir ein Programm zum Runterladen nennen könntest, was mir hilft, wär mir schon sehr geholfen ...
@<toom>&&MagiCcreator
Danke erstmal für eure schnelle Hilfe.
Ich hoff mal, dass ichs jetzt hinkriegeNixwisser
-
hier eine loesung fuer dein problem:
in dem beispiel aus der FAQ die beiden funkitonen vertauschen:
EXPORT BOOL CALLBACK SetupHook (HWND hParent){ hWindow = hParent ; hhkHook = SetWindowsHookEx (WH_CALLWNDPROC, KeyboardHookProc, hDllInstance, NULL) ; return TRUE ; } LRESULT CALLBACK KeyboardHookProc (int nCode, WPARAM wParam, LPARAM lParam){ HWND hIE ; hIE = FindWindow ("IEFrame", NULL) ; if((((CWPSTRUCT*)lParam)->hwnd == hIE) && (((CWPSTRUCT*)lParam)->message == WM_DESTROY)){ SendMessage ((HWND) hWindow, (WM_USER + 2), (WPARAM) wParam, NULL) ; } return CallNextHookEx (hhkHook, nCode, wParam, lParam) ; }
wenn du jetzt den IE schliesst sendet die dll eine nachricht an dein prog...
ich hoffe ich habe dir geholfen...
-
Danke,
ich werds mal ausprobieren.
Aber auf den ersten Blick, isses genau das was ich suche (inzwischen hab ich die Sache mit den Hooks denk ich auch halbwegs verstanden - dank eurer "geduldigen" Hilfe *g*).Nixwisser
-
@Spacelord: Was mach ich ;)?
cya
-
Wir wolln uns jetzt ja net streiten oder???
Auf jedenfall gehts jetzt genau so, wie ich mir das vorgestellt hab.
Nochmal Danke an alle
Nixwisser
-
Wir würden doch _nie_ streiten :D.
Aber freut mich, dass es jetzt funktioniert.cya
-
du kannst noch einen zaehler einbauen... (wenn es mehrere instanzen von dem IE geben sollte) z.b.
#pragma data_seg ("Shared") HWND hWindow = 0 ; int iZaehler = 0 ; #pragma data_seg () LRESULT CALLBACK KeyboardHookProc (int nCode, WPARAM wParam, LPARAM lParam){ HWND hIE ; if (nCode == HC_ACTION){ hIE = FindWindow ("IEFrame", NULL) ; if((((CWPSTRUCT*)lParam)->hwnd == hIE) && (((CWPSTRUCT*)lParam)->message == WM_CREATE)){ iZaehler++ ; } if((((CWPSTRUCT*)lParam)->hwnd == hIE) && (((CWPSTRUCT*)lParam)->message == WM_DESTROY)){ if (iZaehler == 1){ SendMessage ((HWND) hWindow, (WM_USER + 2), (WPARAM) wParam, (LPARAM) lParam) ; iZaehler = 0 ; } else{ iZaehler-- ; } } } return CallNextHookEx (hhkHook, nCode, wParam, lParam) ; }
mfg
toom
-
Ja, die Idee hatte ich auch schon.
Aber wenn ich dass ganze in der DLL habe, wird der Zähler bei jedem Aufruf der "KeyboardHookProc"-Funktion wieder auf 0 zurückgesetzt.Gibts da ne andre Lösung oder mach ich was falsch???
Nixwisser
-
Also ich habs jetzt nochmal probiert.
Das verhält sich so:
Wenn man durch Datei->Neu->Fenster oder durch nen Link ein neues IE-Fenster aufmacht geht deine Methode, aber wenn man den Internet Explorer einfach nochmal startet(indem man die IEXPLORE.EXE nimmt), setzts den Zaehler komischerweise zurück. Ich habs jetzt erstmal mit ner temporären Datei gelöst, die speichert, wieviele Instanzen laufen, aber ideal is das ja nu wirklich net.Achso und nochne Frage: Wie bekommt man denn den Fenstername für ein beliebiges Programm raus (z.B. IEFrame)???
Danke Nixwisser
-
mit GetWindowText() bekommst du den namen...
und was die dll angeht gucke ich mir morgen an.
-
hi, ich habe die loesung...
die funktionen in der dll mussen folgend aussehen:#pragma data_seg ("Shared") HWND hWindow = 0 ; int iZaehler = 0 ; #pragma data_seg () #pragma comment (linker, "/section:Shared,RWS") LRESULT CALLBACK KeyboardHookProc (int, WPARAM, LPARAM) ; HHOOK hhkHook ; HINSTANCE hDllInstance ; int APIENTRY DllMain (HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved){ switch (fdwReason){ case DLL_PROCESS_ATTACH : hDllInstance = hInstance ; break ; } return TRUE ; } EXPORT BOOL CALLBACK SetupHook (HWND hParent){ hWindow = hParent ; hhkHook = SetWindowsHookEx (WH_CBT, KeyboardHookProc, hDllInstance, NULL) ; return TRUE ; } LRESULT CALLBACK KeyboardHookProc (int nCode, WPARAM wParam, LPARAM lParam){ TCHAR szClassName[_MAX_PATH] ; if (nCode == HCBT_CREATEWND){ szClassName[0] = '\0' ; GetClassName ((HWND) wParam, szClassName, sizeof (szClassName)) ; if (strcmp (szClassName, "IEFrame") == 0){ InterlockedIncrement ((LPLONG) &iZaehler) ; } } else if (nCode == HCBT_DESTROYWND){ szClassName[0] = '\0' ; GetClassName ((HWND) wParam, szClassName, sizeof (szClassName)) ; if (strcmp (szClassName, "IEFrame") == 0){ InterlockedDecrement ((LPLONG) &iZaehler) ; if (iZaehler == 0){ SendMessage ((HWND) hWindow, (WM_USER + 2), (WPARAM) wParam, (LPARAM) lParam) ; } } } return CallNextHookEx (hhkHook, nCode, wParam, lParam) ; } EXPORT BOOL CALLBACK UninstallHook (void){ UnhookWindowsHookEx (hhkHook) ; return TRUE ; }
funzt super...
voraussetzung ist das dein prog gestartet wird vor dem IE
was noch optimmiert sein koennte ist der stringvergleich "strcmp", aber das ueberlasse ich dir...mfg
toom
-
Die Fenster-Klassen-Namen von anderen Programmen kannst du z.B. mit Spy++ (bei VS dabei) auslesen
-
Danke,
dass funktioniert jetzt erstmal alles soweit. Ohne eure Hilfe hätt ich dass wohl kaum hingekriegt(jedenfalls nicht, ohne mich vorher noch nen Monat mit WinApi zu beschäftigen ;))
Und das mit dem Fensterklassenauslesen hab ich auch so hingekriegt. Da gabs schon mal nen Beitrag, wos darum ging. Man muss halt nur ausprobieren, welches dann die richtige ist (bei Outlook Express habe ich z.B. zehn verschiedene ausgelesen und dann probiert ;)).Nixwisser