HookMainWindow



  • Hallo
    mein Programm bringt vor verlassen eine Messagebox mit Abfrage ob wirklich
    verlassen werden soll. Wenn Windows heruntergefahren wird, will ich das um-
    gehen. Habe dazu mit Application->HookMainWindow() eine Routine eingebunden,
    die die WM_QUERYENDSESSION-Message abfängt und darin das Programm beendet.
    Das funktioniert auch, nur fährt Windows selbst jetzt nicht mehr herunter.

    Code:

    bool __fastcall TForm1::WinMessageHook(TMessage& WinMsg)
    {
       bool retval;
       switch( WinMsg.Msg )
       {
           case WM_QUERYENDSESSION:
                 // Cleanup data , Application->Terminate()
                 ExitWithoutQuestion();
                 WinMsg.Result = true;    //  ??
                 //WinMsg.LParam = true;  //  ??
                 retval = true;           // (ob retval true oder false ist macht 
                                          //     kein Unterschied)
                 break;
           default : 
                 retval = false; break;
       }
    
       return retval;
    }
    

    Wenn mir jemand weiterhelfen kann, waere ich sehr dankbar
    Gruesse
    Juergen



  • Hm,

    was ist denn ExitWithoutQuestion()? Wird aus der Funktion zurückgekehrt?

    Ich hab's bei mir sehr ähnlich gelöst:
    Header:

    void __fastcall WndProc(Messages::TMessage &Message);
    

    CPP:

    void __fastcall TForm_MainViewer::WndProc(Messages::TMessage &Message)
    {
    	bool handled = false;
    	if ((Message.Msg == WM_SYSCOMMAND) && (Message.WParam == SC_SCREENSAVE))
    	{
    		Message.Result = false;
    		ShowMessage("Windows kann den Bildschirmschoner nicht aktivieren, solange die Fertigungsplanung aktiv ist.");
    		handled = true;
    	}
    	if (!handled)
    	{
    		if (Message.Msg == WM_QUERYENDSESSION)
    		{
    			Message.Result = false;
    			ShowMessage("Windows kann nicht beendet werden. Beenden Sie zuerst die Fertigungsplanung.");
    			handled = true;
    		}
    	}
    	if (!handled)
    		TForm::WndProc(Message);
    }
    

    Im ersten Schritt wird überprüft ob der User versucht den ScreenSaver zu reaktivieren. Im zweiten Schritt wird überprüft, ob Windows heruntergefahren werden soll und dieses unterbunden. Wenn die Nachricht nicht von der Routine bearbeitet wird, wird die der normale Messagehandler aufgerufen.



  • Danke fuer die Antwort, deine Vermutung war richtig.
    Da in Fkt ExitWithoutQuestion() Application->Terminate()
    aufgerufen wird, ist dort scheinbar Schluss.
    Werde mir was anderes ueberlegen muessen...



  • Wenn Du statt Terminate() Close() verwendest geht es doch fast. Nur noch in dem Messagehook eine globale Variable setzen (WindowsShuttingDown = true) und wenn die Varible = true ist in der OnCloseQuery des Forms alle Benutzerabfragen weglassen...


Anmelden zum Antworten