SetWindowHookEx
-
Ich versuche Abzufangen wenn in ein Fenster eines anderes Programms geschlossen wird.Dafür rufe ich SetWindowHookEx in mit WH_GETMESSAGE auf,der Hook der zurück geliefert wird ist nicht nULL also müsste der Hook registriert sein,aber die Callbackmethode Methode wird nicht aufgerufen.
BOOL CCloseStopApp::InitInstance() { AfxEnableControlContainer(); // Standardinitialisierung // Wenn Sie diese Funktionen nicht nutzen und die Größe Ihrer fertigen // ausführbaren Datei reduzieren wollen, sollten Sie die nachfolgenden // spezifischen Initialisierungsroutinen, die Sie nicht benötigen, entfernen. #ifdef _AFXDLL Enable3dControls(); // Diese Funktion bei Verwendung von MFC in gemeinsam genutzten DLLs aufrufen #else Enable3dControlsStatic(); // Diese Funktion bei statischen MFC-Anbindungen aufrufen #endif closeHook = SetWindowsHookEx(WH_GETMESSAGE,GetOtherClose,this->m_hInstance,NULL); if(closeHook == NULL) { AfxMessageBox("Fehler"); } CCloseStopDlg dlg; m_pMainWnd = &dlg; int nResponse = dlg.DoModal(); if (nResponse == IDOK) { // ZU ERLEDIGEN: Fügen Sie hier Code ein, um ein Schließen des // Dialogfelds über OK zu steuern } else if (nResponse == IDCANCEL) { // ZU ERLEDIGEN: Fügen Sie hier Code ein, um ein Schließen des // Dialogfelds über "Abbrechen" zu steuern } // Da das Dialogfeld geschlossen wurde, FALSE zurückliefern, so dass wir die // Anwendung verlassen, anstatt das Nachrichtensystem der Anwendung zu starten. return FALSE; } LRESULT CALLBACK GetOtherClose( int code, WPARAM wParam,LPARAM lParam ) { MSG * msg = (MSG *) lParam; HWND otherWindow = FindWindow(NULL,"Test"); if(otherWindow != NULL) if(msg->message == WM_CLOSE&&msg->hwnd==otherWindow) { AfxMessageBox("Close"); } return CallNextHookEx(closeHook,code,PM_REMOVE,lParam); }
-
Weil diese Art von Hook nur Deine Applikation berücksichtigt...
Systemweite Hooks müssen in DLLs liegen.