wxWidgets: Abfangen von Tastendrücken
-
Hi,
ich suche eine Möglichkeit Tastendrücke, die meine Andwendung (hat Fokus, Vollbildmodus) in Form von Events erhält, nicht an das jeweilige Betriebssystem (Linux, Windows, Mac OS
weiterzuleiten, um meine Anwendung dann über diesen Weg zu beenden. Wisst ihr einen Weg?
MfG
WilMen
-
Hier ein kleines Beispiel von mir, wie Du mit Hilfe eines Tastendrucks zwischen Vollbild und Fenstergröße wecheln oder das Programm beenden kannst.
HINWEIS: Das Tastatur-Ereignis funktioniert erst, wenn Du einmal auf das Fenster klickst. Das Tastatur-Ereignis habe ich bewusst in ein Panel gepackt, da es beim Frame nicht funktioniert. Bitte frage mich nicht warum.
Ich hoffe, ich konnte Dir helfen.
base.h
//-------------------------------------------------- //Autor: Stefan Rauch Datum: 11. August 2008 //-------------------------------------------------- #ifndef BASE_H #define BASE_H class srApp : public wxApp { public: virtual bool OnInit(); }; class srFrame : public wxFrame { private: wxPanel *panel; public: const wxWindowID srID_PANEL; srFrame(const wxString &title, const wxPoint &point, const wxSize &size, long style); ~srFrame(); void OnPaint(wxPaintEvent &event); void OnPress(wxKeyEvent &event); void OnSize(wxSizeEvent &event); }; #endif
base.cpp
//-------------------------------------------------- //Autor: Stefan Rauch Datum: 11. August 2008 //-------------------------------------------------- #include <wx/wx.h> #include <GL/gl.h> #include "base.h" //-------------------------------------------------- //Der Grundbaustein srApp //-------------------------------------------------- IMPLEMENT_APP(srApp) //Ruft das Awendungsprogramm auf bool srApp::OnInit() { srFrame *frame = new srFrame(wxString("Das Tastertur-Ereignis"), wxPoint(-1, -1), wxSize(800, 600), wxDEFAULT_FRAME_STYLE); frame->Connect(wxID_ANY, wxEVT_SIZE, wxSizeEventHandler(srFrame::OnSize)); frame->Show(TRUE); SetTopWindow(frame); return TRUE; } //-------------------------------------------------- //Der Baustein srFrame //-------------------------------------------------- //Der Konstruktor srFrame::srFrame(const wxString &title, const wxPoint &point, const wxSize &size, long style) : wxFrame((wxFrame *)NULL, -1, title, point, size, style), srID_PANEL(1) { panel = new wxPanel(this, srID_PANEL, wxPoint(0, 0), wxSize(800, 600)); panel->Connect(wxEVT_PAINT, wxPaintEventHandler(srFrame::OnPaint), NULL, this); panel->Connect(wxEVT_KEY_DOWN, wxKeyEventHandler(srFrame::OnPress), NULL, this); panel->SetBackgroundColour(wxColour(0, 0, 0)); } //Der Destruktor srFrame::~srFrame() { } //Das Zeichen-Ereignis void srFrame::OnPaint(wxPaintEvent &event) { wxSize framesize = GetSize(); wxPaintDC *paint = new wxPaintDC(panel); paint->SetBackground(wxBrush(wxColour(0, 0, 0))); paint->SetBrush(wxBrush(wxColour(128, 128, 128))); paint->SetFont(wxFont(12, wxROMAN, wxNORMAL, wxNORMAL, FALSE, "DejaVu Sans")); paint->SetTextForeground(wxColour(0, 0, 0)); paint->SetPen(wxPen(wxColour(128, 128, 128), 1)); paint->DrawRectangle(wxRect(0, (framesize.y - 45), framesize.x , 25)); paint->DrawText(wxString("B = Beenden\tF = Fullscreen / Fenster"), 5, (framesize.y - 42)); delete paint; } //Das Tastatur-Ereignis void srFrame::OnPress(wxKeyEvent &event) { int keycode = event.GetKeyCode(); wxSize framesize = GetSize(); wxSize screensize = wxGetDisplaySize(); switch(keycode) { case 'B': Close(); break; case 'F': if(IsFullScreen()) { panel->SetSize(wxSize(framesize.x, framesize.y)); ShowFullScreen(FALSE); } else { panel->SetSize(wxSize(screensize.x, screensize.y)); ShowFullScreen(TRUE); } break; } } //Das Groessen-Ereignis void srFrame::OnSize(wxSizeEvent &event) { wxSize framesize = GetSize(); panel->SetSize(wxSize(framesize.x, framesize.y)); Refresh(); }
Gruß,
Stefan
-
Hat einer eine Idee, wie man es hinbekommt die Tastatur-Ereignis schon beim Aufruf des Programms zu aktivieren? Und wenn wir gerade dabei sind, wie lässt man den Mauszeiger verschwinden?
-
Hi Stefan!
Danke für deine Hilfe. Hast du das Programm extra für mich zur Veranschaulichung geschrieben? Wenn ja: Wahnsinn, so stellt man sich Hilfe vor!
Leider hat sich mein Problem als noch schwieriger und platformspezifischer erwiesen, als ich dachte. Ich muss die unter Windows typische Tastenkombination "Strg+Alt+Entf" abfangen, damit dann nicht der Windows-Sicherheits-Dialog kommt bzw. sich der Taskmanager öffnet und das Programm dann darüber beendet werden kann. Zu diesem Thema, das sich erstmal einfach anhört, und doch ziemlich kompliziert und aufwendig ist, habe ich auch schon einiges gefunden. Stichwort: GINA.
MfG WilMen
-
Achso, den Eingabe-Fokus bekommst du mittels eines Aufrufs von der Methode SetFokus() in deiner OnInit-Methode.
bool srApp::OnInit() { //... frame->SetFocus() ; // ... return TRUE; }
MfG WilMen