Key Abfrage
-
neee, nur in meinem Hauptdialog
ich hab in der MSDN schon die VK - Codes gefunden, aber keine ahnung wie ich das auswerten soll
bis jetzt hab ich nur die Nachricht WM_KeyDown hinzugefügt
void CAFKWin32XPDlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) { // TODO: Code für die Behandlungsroutine für Nachrichten hier einfügen und/oder Standard aufrufen CDialog::OnKeyDown(nChar, nRepCnt, nFlags); }
-
hab das jetzt mal so probiert
aber kein erfolg
MSG* pMsg; if ( pMsg->message == WM_KEYDOWN) UINT nKeyCode = pMsg->wParam; if ( pMsg->wParam == VK_BACK_SPACE) MessageBox("test",NULL,MB_OK);
-
hab es jetzt mit der PreTranslateMessage gemacht
funzt wunderbar
hab nur noch ein Problem
wenn ich die hoch und runter tasten drücke, geht zwar die Maschine hoch und runter, aber der hüpft mir auch auf den button, die ich noch am hauptdialog habe hoch und runter
kann ich das irgendwie unterbinden?
-
Nimm mal den Aufruf der Basisklasse raus, aber nur für den Zweig, wo du die Tasten behandelt hast.
-
hö? wie meinste das?
-
Irgendwo in der Funktion steht CDialog::PreTranslateMessage...
Das solltest du nur dann aufrufen, wenn es auch ausgeführt werden soll. Da dich aktuell die Standardbehandlung der Pfeiltasten stört - ruf die Funktion nicht auf.
Falls die Erklärung immer noch zu wirr war (sorry, aber den Nachrichtenkram kann ich nicht gut erklären), dann zeig mal die Funktion und ich bau das um.
-
BOOL CAFKWin32XPDlg::PreTranslateMessage(MSG* pMsg) { // TODO: Speziellen Code hier einfügen und/oder Basisklasse aufrufen if ( pMsg->message == WM_KEYDOWN ) { switch (pMsg->wParam) { case VK_UP: { OnHoch(); break; } case VK_DOWN: { OnRunter(); break; } case VK_SPACE: { OnStop(); break; } } } return CDialog::PreTranslateMessage(pMsg); }
-
BOOL CAFKWin32XPDlg::PreTranslateMessage(MSG* pMsg) { // TODO: Speziellen Code hier einfügen und/oder Basisklasse aufrufen if ( pMsg->message == WM_KEYDOWN ) { switch (pMsg->wParam) { case VK_UP: { OnHoch(); return TRUE; // wurde behandelt, fertig. break; } case VK_DOWN: { OnRunter(); return TRUE; // wurde behandelt, fertig. break; } case VK_SPACE: { OnStop(); return TRUE; // wurde behandelt, fertig. break; } } } return CDialog::PreTranslateMessage(pMsg); }
So meinte ich. Jetzt sollte es gehen.
Die break sind nun eigentlich überflüssig, aber ich lasse sowas vorsichtshalber drin, falls ich das return mal wieder rausnehme und nicht dran denke.
-
jo, klappt
also hat es daran gelegen, dass ich kein return drin hatte in den switch cases?
-
Das
return TRUE;
sagt aus, dass du die Nachricht behandelt hast.
(Frag mich bitte nicht, was bei FALSE passiert - ich hab das nur aus anderen Projekten abgeguckt.)In der Basisklasse (hier CDialog) werden die Sachen gemacht, die du nicht erledigt hast.
In diesem Fall z.B. die Behandlung der Pfeiltasten. Normalerweise springt man damit von Button zu Button, wie mit der Tab-Taste.
Da du das nicht willst, darfst du in dem Fall einfach nur die Basisklasse nicht aufrufen - schließlich hast du schon alle Arbeit erledigt.Du kannst ja mal (zu Forschungszwecken) vor die Zeile
return CDialog::PreTranslateMessage(pMsg);
ein
return TRUE;
schreiben, dann siehst du mal, was alles in PreTranslateMessage gemacht wird.
Mach das danacha aber wieder weg.
-
is ja krass
da kannste ja mal gar nichts mehr machen außer die tasten, die ich abfrage
-
Wegen der Erkenntnis solltest du das ja mal testen.
-
an was denkst du denn, was ich da testen kann?
-
Na, nix eben - hat doch geklappt.
Außerdem kannst du fürs "weitere Leben" daraus mitnehmen, dass Basisklassenaufrufe die Dreckarbeit erledigen und man sie bei Bedarf auch weglassen kann.
-
*gggg*
ok, jetzt hab ich das auch verstanden
danke dir