Das "Aktiv werden" eines Fensters verhindern
-
Hi!
Ich hab mal eine Frage. Es geht um folgendes. Ich möchte mit meinem Programm die Fenster (es können bis zu 20 sein) eines anderen Programmes "kontrollieren". D.h. wenn ein Fenster des Programmes aktiv wird (es kommt sofort in den Vordergrund und schnappt sich den Focus, egal was man macht), möchte ich dies vorher abfangen und unterbinden.
Ich möchte dadrüber ein System setzen, dass die Fenster nach einem besseren System aktiv setzt, daher brauche ich das.So ich habe schon gesucht und dazu ein Thread gefunden, wo ein Hook gesetzt wird und ich informiert werde, wenn ein Fenster den Focus bekommt.
Und zwar hier: http://www.c-plusplus.net/forum/viewtopic-var-t-is-209856-and-highlight-is-window+hook.htmlIst das die richtige herangehensweise? Kann ich dadurch dann auch das Event "schlucken", damit das betroffene Fenster eben nicht aktiv wird?
Oder gibt es vielleicht bessere Methoden?
Danke für die Unterstützung
-
Im Prinzip müsste das mit einem systemweiten Message-Hook vor der Ausführung gehen, wobei die Fenster-Handles bekannt sein müssen. Dann genügt wahrscheinlich ein ShowWindow(hwndFenster,FALSE). Das Abfangen des Focus erscheint mir zu spät.
-
Von welcher Aktivierung redest Du? Maus oder Tastatur?
Maus ist einfach
WM_MOUSEACTIVATE
http://msdn.microsoft.com/en-us/library/ms645612(VS.85).aspxTastatur? Da wäre ein simpler Eingriff in die Messageloop wohl am einfachsten.
Einen Hook halte ich hier für Kanonen auf Spatzen...
-
Hallo Martin.
Also die Fenster des anderen Programmes kommen aufgrund des Programmes selbst in den Vordergrund. D.h. weder Keyboard oder Maus ist daran beteiligt.
Es geht um ein Pokerprogramm und wenn man mehrere Fenster (=Tische) auf hat und an die Reihe kommt, dann wird das Fenster eben aktiv und kommt in den Vordergrund und erhält vollen Focus.
Ich möchte das nun unterdrücken, damit keine Fenster mehr in den Vordergrund kommen, sondern erst, wenn ich sie "lasse".Das bedeutet ich muss irgendwie feststellen, wenn ein Fenster aktiv werden will und es dann auch stoppen können. Und das geht doch dann nur mit einem Hook oder nicht?
-
Also ich habe jetzt die Hook Variante probiert und hab ein Problem. Ich hab es soweit hinbekommen, dass mein Hook auf Messages reagiert, die von meinem Programm verursacht werden. Ich habe Probleme damit, den Hook global und nicht nur in meinem Thread, zu registrieren. Aber es klappt einfach nicht.
Hier mal mein Code.HINSTANCE hInst = NULL; extern "C" BOOL APIENTRY DllMain(HINSTANCE _hInst, DWORD reason, LPVOID reserved) { switch (reason) { case DLL_PROCESS_ATTACH: hInst = _hInst; break; default: break; } return TRUE; } LRESULT CALLBACK wProc(int nCode,WPARAM wParam,LPARAM lParam){ if( nCode < 0 ) { return CallNextHookEx( 0, nCode, wParam, lParam ); } if( nCode == HCBT_ACTIVATE ) { printf("Activated: %d\n", (HWND)wParam); } return CallNextHookEx( NULL, nCode, wParam, lParam ); } void MsgLoop() { MSG message; while (GetMessage(&message, NULL, 0, 0)) { TranslateMessage(&message); DispatchMessage(&message); } } JNIEXPORT void JNICALL Java_LowLevelHook_Hook_registerHook(JNIEnv * env, jobject obj) { //Mit dieser Variante kann ich garkeinen Hook registrieren. // HOOKPROC hookProc = HOOKPROC( GetProcAddress( hInst, "wProc" ) ); // HHOOK hookHandleWindow = SetWindowsHookEx(WH_CBT, hookProc, hInst, 0 ); //Das hier reagiert nur auf meinen Thread und nicht global HHOOK hookHandleWindow = SetWindowsHookEx(WH_CBT, wProc, hInst, 0 ); if (hookHandleWindow == NULL ){ printf("C++: Java_Hook_registerHook - WindowHook failed!\n"); return; } MsgLoop(); if (!UnhookWindowsHookEx(hookHandleWindow)) { printf("C++: Java_Hook_registerHook - Unhook failed\n"); } else { printf("C++: Java_Hook_registerHook - Unhook WindowHook successful\n"); } } JNIEXPORT void JNICALL Java_LowLevelHook_Hook_unRegisterHook(JNIEnv *env, jobject object) { if (hookThreadId == 0) return; printf("C++: Java_Hook_unRegisterHook - call PostThreadMessage.\n"); PostThreadMessage(hookThreadId, WM_QUIT, 0, 0L); }So das ganze funktioniert nur lokal, andere Ereignisse bekomem ich nicht mit.
Was muss ich ändern? Muss ich irgendwas als extern definieren?
Stimmt das handle "hInst" überein mit "LoadLibrary("meine.dll")" wenn ich sie extern aufrufen würde?Wie man sieht rufe ich die DLL aus Java heraus auf ..
-
Nach weiterem gegoogle hab ich eigentlich ein Beispiel gefunden, wo genau mein Problem behoben wird, aber er will immernoch nicht.
Dort wird beschrieben, man soll das Hook Handle so beschreiben:
#pragma data_seg("Shared") HHOOK hookHandleWindow = NULL; #pragma data_seg() #pragma comment(linker, "/section:Shared,rws")dann habe ich noch diese Zeile eingefügt:
LRESULT CALLBACK wProc(int nCode, WPARAM wParam, LPARAM lParam);Aber immernoch das gleiche...
hier wird das beschrieben: http://www.codeguru.com/cpp/w-p/system/security/article.php/c5761
jemand eine Idee was bei mir nicht stimmt?

-
Ok ich hab das Problem erkannt... der Hook sitzt richtig, es stimmt alles nur das "printf" bezieht sich nur auf meine console. Die DLL wird ja von allen anderen offenen Prozessen geladen und demnach schreibt jeder Prozess die Ausgabe is seine eigene Konsole. Habs bemerkt als ich mal alles in eine Datei gelogged hab. Jeder Prozess hatte plötzlich diese Datei erstellt... und seine Zeug dann in seine seperate Datei geschrieben.
jetzt muss ich es nurnoch hinbekommen, dass jeder Prozess dann quasi meine Funktion aufruft...es an meine Konsole weitergibt... schlussendlich soll es so sein, dass jeder Prozess dann eine Funktion in meinem Programm aufrufen soll.
-
Hallo...
also das mit dem Hook habe ich alles wunderbar hinbekommen. Leider klappts nicht so.Ich habs schon mit einem WH_CALLWNDPROC Hook und der Message WM_WINDOWPOSCHANGING versucht, aber mit dem Hook kann man keine Messages verändern...Diese Message habe ich mir über spyxx besorgt...
Ich möchte ja, dass das Fenster, das von allein sich in den Vordergrund mogeln will, verbieten das zu tun

Wie könnt ich noch an die Sache rangehn?
Ich fürchte das Fenster bekommt nicht mal den Keyboard Focus....noch jemand ne Idee ?