wxEVT_END_SESSION in wxApp benutzten -> evt wird nicht abgefangen



  • Hallo liebe Forengemeinde,

    ich habe folgendes Problem:
    Ich möchte in meinem wxProjekt das Event des PC-Shutdowns abfangen, um darauf dann zu reagieren(speichern und Programm beenden...)
    Nun habe ich mir bereits das wxCloseEvent angesehen. Da steht, dass wenn WIndows runtergefahren wird, ein wxEVT_END_SESSION erzeugt wird...
    Nun meine Frage: Wie muss ich dieses Event mit meiner MainFrame Klasse verknüpfen?
    Laut doc muss die Klasse ja von wxApp abgeleitet sein und wenn ich eine extra Klasse anlege, funzt das auch nicht richtig...

    Ich benutze Code::Blocks, wxWidgets 2.8 und C++

    Danke schonmal im voraus 🙂
    Freue mich über Antworten 👍



  • http://docs.wxwidgets.org/trunk/classwx_close_event.html

    # EVT_END_SESSION(func):
    Process a wxEVT_END_SESSION session event, supplying the member function. This event can be handled in wxApp-derived class only.

    class MyApp : public wxApp
    {
       virtual void SessionEnd(wxCloseEvent& e)
       {
         // Process event
       }
    
    private:
       DECLARE_EVENT_TABLE();
    }
    
    BEGIN_EVENT_TABLE(MyApp, wxApp)
        EVT_END_SESSION(MyApp::SessionEnd)
    END_EVENT_TABLE()
    

    Nicht getestet.
    rya.



  • Danke erstma für die Antwort.

    Hab jetzt mehrere Varianten ausprobiert:

    class WinShutdown : public wxApp
    {
    public:
    
       WinShutdown(MainFrame *p) : m_parent(p)
       {
            Connect(-1, wxEVT_END_SESSION,(wxObjectEventFunction)&WinShutdown::SessionEnd);
       }
    
    protected:
    
       void SessionEnd(wxCloseEvent& e)
       {
            m_parent->OnShutdown();
       }
    
    private:
    
       PC_WatchFrame *m_parent;
    
    //   DECLARE_EVENT_TABLE();
    };
    

    Dann das ganze nochma mit Event_Table:

    //WinShutdown EventTable
    BEGIN_EVENT_TABLE(WinShutdown,wxApp)
        EVT_END_SESSION(WinShutdown::SessionEnd)
    END_EVENT_TABLE()
    

    Und die Funktion mal virtuelle, mal öffentlich...
    Hat alles nicht geklappt...Mein Programm stürtzt beim Windows Shutdown immernoch ab...(Da liegt der Fehler nicht. Hab ihn im SHutdownbefehl ne msgbox anzeigen lassen.. die kommt auch nicht)

    Hast du oder sonst wer vllt noch ne Idee, wie das gehen könnte??? 😞



  • Ehm, es darf nur eine wxApp pro Anwendung geben..
    Das muss da rein wo Du Deine Anwendung initialisierst.
    rya.



  • Habe das ganze jetzt einmal getestet.
    Ergebnis im nächsten Beitrag...



  • Ok, habe gerade nochmal es so verändert, dass nun alles in meiner wxApp ist...
    SIeht jetzt so aus:

    App.h

    class MyApp : public wxApp
    {
        public:
    
            virtual bool OnInit();
    
        protected:
    
            void SessionEnd(wxCloseEvent& e)
            {
                 Frame->OnShutdown();
            }
    
        private:
    
            MyFrame* Frame;
    
            DECLARE_EVENT_TABLE();
    };
    

    App.cpp

    BEGIN_EVENT_TABLE(MyApp,wxApp)
        EVT_END_SESSION(MyApp::SessionEnd)
    END_EVENT_TABLE()
    
    bool MyApp::OnInit()
    {
        //(*AppInitialize
        bool wxsOK = true;
        wxInitAllImageHandlers();
        if ( wxsOK )
        {
        	Frame = new MyFrame(0);
        	SetTopWindow(Frame);
        }
        //*)
        return wxsOK;
    }
    
    IMPLEMENT_APP(MyApp);
    

    Funktioniert aber leider immernoch nicht...Die MSGBox wird immernoch nicht bei EndSession() angezeigt, auch nach dem SHutdownbefehl kommt weiterhin meine Fehlermeldung, dass es nicht beendet werden konnte, weil ja noch die Dateien geöffnet sind...

    Hast du oder jmd andres sonst noch eine Idee oder habe ich schon wieder so einen dumme Fehler?


Anmelden zum Antworten