Pretranslatemessage und Rückgabewert für WM_QUERYENDSESSION



  • hallo ich habe in meinem mfc programm, bzw dialog folgenden code

    BOOL CNetzwerkClientKaSimDlg::PreTranslateMessage(MSG* pMsg)
    {
    	// TODO: Speziellen Code hier einfügen und/oder Basisklasse aufrufen
    	if(pMsg->message == WM_QUERYENDSESSION)
    	{
    	return false;
    	}
    	if(pMsg->message == WM_KEYDOWN){
    	int t=0;
    	}
    	return CDialog::PreTranslateMessage(pMsg);
    }
    

    wenn ich eine taste drücke dann wird t auf 0 gesetzt.
    wenn ich windows herunterfahre sehe ich im debugger nicht das die erste if anweisung betreten wird,da windows den debugger schliesst, aber ich denke mir dass es funktionieren müsste weil es ja mit dem WM_KEYDOWN ja auch geht.
    Es wird also false zurückgegeben, somit müsste doch das herunterfahren unterbrochen werden. was mache ich hier falsch?
    😕

    viele grüsse und muchos danke
    xadine


  • Mod

    Warum verwendest Du nicht einen normalen Message-Map Eintrag?

    PreTranslateMessage ist hier stilistisch die falsche Stelle.

    Und WM_QUERYENDSESSION wird versendet, bevor die Applikationen geschlossen werden. Es ist die Anfrage!



  • ich verwende pretranslate weil ich es nicht besser weiss. normalerweise mache ich über den klasseneditor onpaint und so. ich weiss nicht wie ich genau vorgehen muss bei den messagemap einträgen, also wenn ich die da manuell einfügen soll.
    was meinst du mit queryendsession ist die Anfrage? also ich dachte wenn ich auf windows herunterfahren klicke wird wm_queryendsession versendet und mit false wird das verhindert. 🕶
    gruss xadine



  • Erstens: Wenn der ClassWizard nichts anbietet, kannst du mit ON_MESSAGE() auch eigene Nachrichten-Routinen in die MessageMap eintragen - die erforderliche Signatur wäre:

    afx_msg LRESULT On...(WPARAM wParam,LPARAM lParam);
    

  • Mod

    Xadine schrieb:

    ich verwende pretranslate weil ich es nicht besser weiss. normalerweise mache ich über den klasseneditor onpaint und so. ich weiss nicht wie ich genau vorgehen muss bei den messagemap einträgen, also wenn ich die da manuell einfügen soll.
    was meinst du mit queryendsession ist die Anfrage? also ich dachte wenn ich auf windows herunterfahren klicke wird wm_queryendsession versendet und mit false wird das verhindert. 🕶
    gruss xadine

    Der Classwizard oder die Properties beiten Dir entsprechende Handler für diese Nachricht an.

    WM_QUERYENDSESSION ist eine Anfrage! Wie Du es selber schreibst. Du kannst es also Debuggen. Solange irgend jemand FALSE returtniert wird nicht herunter gefahren (jedenfalls nicht immer).

    Du kannst Dir nicht sicher sein, dass ein Windows OS nicht herunter fährt, siehe Vista!
    http://blog.m-ri.de/index.php/2007/03/26/vista-beendet-programme-auch-wenn-wm_queryendsession-false-returniert/



  • habs jetzt gelöst, danke schön.
    hab in der msdn gelesen dass nach 5 sekunden ohne antwort heruntergefahren wird. ich glaube es mal gelesen zu haben. Wenn mann jetzt bei mir auf keinen button klickt dann fährt windows tatsächlich herunter. das heisst wenn der benutzer auf herunterfahren klickt und nicht auf den bildschirm guckt kommt der shutdown, kann mann das verhindern?

    LRESULT CNetzwerkClientKaSimDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
    {
    	// TODO: Speziellen Code hier einfügen und/oder Basisklasse aufrufen
    	 switch (message) // hier wird die nachricht abgefangen
    	{	
    
    		case WM_QUERYENDSESSION:{
    
    			int ja=0;
    			if(client_connect.gibArbeitet()){
    				 ja=MessageBox("Kasim Rechnet im Hintergrund, Bitte nur Abmelden!\nWindows trotzdem herrunterfahren?","Client",MB_YESNO);
    					if (ja==6) //6=ja  7=nein
    						return true; //		return false; // windows wird herruntergefahren...
    					else
    						return false;
    			}
    			else 
    				return false;
    		 }
             //       ...
        }
    

  • Mod

    Sag mal:
    1. Warum verwendest Du nicht ON_WM_QUERYENDSESSION, sondern wieder so eine tiefen Ansatz wie WndProc?
    2. es gibt auch IDYES und IDNO als Identifier!



  • ich verwende es weil ich es hier
    http://msdn2.microsoft.com/en-us/library/aa376890.aspx so gesehen habe.
    ich bin froh das es funktioniert. mit messagemap hab ich es auch versucht, hab wohl was falsch gemacht. ON_WM_QUERYENDSESSION wie soll ich das implementieren. im klassen wizzard gibts dass nicht.
    weiss nicht wie ich das machen soll, wo kommt die methode her(geerbt?) und muss ich die irgendwo in der messagemap registrieren?

    in dem buch von mir ist id_yes und id_no nicht seperat aufgeführt. wie kann ich die kombinieren? mit nem &?
    und wo ist der unterschied zu id_yesno? also im zusammenhang mit meiner if abfrage, nach 5 sekunden gehts doch eh wieder in den shutdown oder?.
    viele grüsse
    xadine



  • Xadine schrieb:

    in dem buch von mir ist id_yes und id_no nicht seperat aufgeführt. wie kann ich die kombinieren? mit nem &?
    und wo ist der unterschied zu id_yesno? also im zusammenhang mit meiner if abfrage, nach 5 sekunden gehts doch eh wieder in den shutdown oder?.
    viele grüsse
    xadine

    Martin wollte eher darauf hinaus, daß du die Konstanten IDYES und IDNO anstelle der "magic numbers" 6 bzw. 7 verwenden solltest.



  • ahso, ja gut hab mich schon gewundert über die magic numbers. lol


Anmelden zum Antworten