WM_KEYDOWN Frage (Probleme mit Tastenkombinationen)
-
Hallo!
Ich habe das Problem, dass unter Win98 (was ich dummerweise auch unterstützen muss) der Acceleratortable keine Wirkung hat.
Ich habe lange nach dem Fehler gesucht und nix gefunden. Da niemand eine Lösung hatte, habe ich mich mit einem Workaround abgefunden.Der sieht so aus:
BOOL CMainFrame::PreTranslateMessage(MSG* pMsg) { // Wurde eine Taste gedrückt? if (pMsg->message == WM_KEYDOWN) { UINT nKeyCode = pMsg->wParam; // virtual key code of the key pressed if (GetAsyncKeyState(VK_CONTROL)) { if (GetAsyncKeyState(VK_SHIFT)) { // Strg + Shift + ... switch (nKeyCode) { // [...] case _T('b'): SendMessage(WM_COMMAND, ID_LAGER_BUCH_ALLE); return FALSE; break; // [...] default: break; } } else { // Strg + ... switch (nKeyCode) { // [...] case _T('f'): case _T('F'): SendMessage(WM_COMMAND, ID_BEARBEITEN_SUCHEN); return FALSE; break; // [...] default: break; } } } else // Ohne Strg-Taste { switch (nKeyCode) { case VK_ESCAPE: SendMessage(WM_COMMAND, ID_BEARBEITEN_ABBRECHEN); return FALSE; break; // [...] default: break; } } } else if ((pMsg->message == WM_SYSKEYDOWN) && (GetAsyncKeyState(VK_F10))) { SendMessage(WM_COMMAND, ID_BEARBEITEN_SPEICHERN); return FALSE; } return CFrameWnd::PreTranslateMessage(pMsg); }Wenn ich nun Strg+Shift+B drücke, reagiert der Breakpoint in Zeile 16 nicht.

Strg+F funktioniert hingegen, der Breakpoint in Zeile 32 reagiert.Hilfe bitte, wie kriege ich diese verflixten Tastenkombinationen zum Laufen?
Unsere User sind DOS-geschädigt und arbeiten zu 90% per Tastatur.
Ich bin auch offen für ganz andere Lösungen... Hauptsache sie funktionieren.

-
Wenn Du auch nur ein _T('b') abfragst dann funzt es auch nicht.
Bei dir fehlt ein _T('B')
-
Ups, der Fehler war wirklich dämlich, vor allem weil ich es weiter unten ja gemacht habe.

Aber wieso der Standardmechanismus (Acceleratortable) nicht geht, weißt du auch nicht, oder?

Oder wie man den von Hand auslöst?
-
GetAsychnKeystate ist die falsche Funktion. Die liefert nicht den Status zu der Nachricht, die Du gerade behandelts sondern den evtl. neueren aktuellen Status. Das kann zu heftigsten Verwirrungen führen gerade wenn das System etwas stärker belastet ist und zudem die Unterscheidungen gravierende Bearbeitungsunterschiede zeigen (Verschieben/Kopieren).
Immer GetKeyState verwenden. Außer Du benötigst wirklich den aktuellen Wert (den ich allerdings no nie benötigt habe).
-
estartu schrieb:
Aber wieso der Standardmechanismus (Acceleratortable) nicht geht, weißt du auch nicht, oder?

Oder wie man den von Hand auslöst?Nein leider nicht.
So gut kenn ich mich in VC++ auch nicht aus. Bin auch erst seit 1 1/2 Jahren dabei und hab nicht immer so viel Zeit zum Programmieren.
-
@...: Schade, trotzdem vielen Dank.

@Martin: Okay, ich probiere das mal. Hoffentlich hilft es.