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);
    }
    

  • Mod

    Weil diese Art von Hook nur Deine Applikation berücksichtigt...
    Systemweite Hooks müssen in DLLs liegen.


Anmelden zum Antworten