Shortcuts/Keys für das ganze Programm oder ein einzelnes Window definieren?
-
Hallo,
wie macht man das, das ein key in dem ganzen Programm etwas macht oder nur in einem Window, ohne immer zu subclassen und dan in WM_CHAR/WM_KEYDOWN... abzufragen?Vielen Dank
Johannes
-
Da ist die WinApi als bereits alte Systemumgebung etwas schwerfällig. Sie kennt nur Nachrichten, beeinhaltet in den Nachrichten alle wichtigen Informationen und entscheidet selbst wohin diese gelangen, solange man kein subclassing macht. Du denkst irgendwie ereignisorientiert, d.h. ein Shortcut oder ein Tastendruck landet in einer eigenen globalen oder lokalen Funktion mit freier Wahl was geschehen soll. Das geht z.B. mit .Net und C# als standardisiertes Programmiermodell. Weitere Erläuterungen führen hier zu weit. Soviel sei gesagt: man muss anders denken und wesentliche Teile eines Programmes völlig anders aufbauen.
-
Man kann doch einfach die Tastendrücke in der Nachrichtenschleife abfangen, vor oder statt der Translate- und DispatchMessage-Aufrufe.
-
berniebutt schrieb:
Da ist die WinApi als bereits alte Systemumgebung etwas schwerfällig. Sie kennt nur Nachrichten, beeinhaltet in den Nachrichten alle wichtigen Informationen und entscheidet selbst wohin diese gelangen, solange man kein subclassing macht. Du denkst irgendwie ereignisorientiert, d.h. ein Shortcut oder ein Tastendruck landet in einer eigenen globalen oder lokalen Funktion mit freier Wahl was geschehen soll. Das geht z.B. mit .Net und C# als standardisiertes Programmiermodell. Weitere Erläuterungen führen hier zu weit. Soviel sei gesagt: man muss anders denken und wesentliche Teile eines Programme
s völlig anders aufbauen.was???
-
Also berniebutt, so schlimm, wie du es darstellst ist es nun auch wieder nicht...
Siehe hier:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms646373(v=vs.85).aspx
-
Ist alles wie gehabt: Das System - auch mit alternativen Ansätzen - arbeitet weiter mit Nachrichten. Bei WinApi muss man sich um diese Nachrichten selbst kümmern und wissen wohin sie gelangen. Bei den alternativen Ansätzen lösen die Nachrichten definiert gezielte Ereignisse aus, für man die Ereignismethoden (Funktionen) schreiben muss. Subclassing wird zum alten Hut. Aber wir sind hier bei WinApi!
-
Du klingst wie ein Prediger
Und btw: Irgendwelche virtellen Methoden überschreiben ist auch nicht das gelbe vom Ei... Bei "Events" (also boost::signal), würde ich mit mir reden lassen, aber das skaliert für bestimmte event-typen auch nicht so gut oder ist gar nicht anwendbar... Nachrichten sind so ziemlich das flexibelste, was es im Bereich von routbarem Kram nunmal gibt... Kann man natürlich immer noch irgendwas drüberdonnern, das die Nachrichten in Deine geliebten Funktionsaufrufe übersetzt, wenn sie mal an einem Zwischenziel angekommen sind...
-
Hallo,
vielen dank für die vielen Anrworten, ich mach jetzt in der Message-Loop eine abfrage ob WM_KEYDOWN und VK_F5 gedrückt ist, leider kommt das nie an. Aber wenn ich einfach VK_F5 durch VK_ESCAPE austausche dan funktioniert's bei Esc, warum funktioniert das bei F5 nicht???
-
Zeig mal etwas Code her, wo du die Nachrichten abfragst, was funktioniert und was nicht. [F5] gehört in die Rubrik 'Virtueller Tastaturcode'. VK_F5 setzt jedoch voraus, dass dieser Tastaturcode vom System/Tastaturtreiber erkannt wird und die gewünschte Nachricht tatsächlich liefert.
@Decimad: Ich predige nichts. Ich nutze nur unter den verschiedenen Systemumgebungen die dort vorgesehenen und möglichen Ansätze, habe die aber selbst nicht erfunden!
-
while( GetMessage( &msg, NULL, NULL, NULL)>-1) { if (! TranslateAcceleratorW(msg.hwnd, Accelerator1, &msg)) { if (msg.message == WM_HOTKEY) { switch(LOWORD(msg.wParam)) { default: PostMessage(hWnd, WM_COMMAND, msg.wParam, 0); break; } } if (msg.message == WM_KEYDOWN && msg.wParam == VK_ESCAPE) // Funktioniert perfekt { PostMessage(hWnd, WM_CLOSE, 0, 0); } if (msg.message == WM_KEYDOWN && msg.wParam == VK_F5) // Kommt nie ann { if(GetParent(msg.hwnd) == hWnd3 || msg.hwnd == hWnd3) { PostMessage(hWnd3, WM_COMMAND, ID_EL_RELOAD, 0); } } TranslateMessage(&msg); DispatchMessage(&msg); } }
-
Für solche Aufgaben nimmt man Accelerator und der macht den Rest und wandelt tastatureingabenin WM_COMMAND Nachrichten um.
Definiere für jedes Fenster die entsprechenden Accelerator und rufe diese mit diesem fensterhandle in der richtigen (von Dir festgelegten) Reihenfolge auf...