Auf Bestimmte Tasten reagieren
-
Mein Problem ist heir schon einige MAls durchgekaut worden, aber ich komm trotzdem nicht ganz klar.
Ich möchte eine Anwendung schrieben, die mir auf bestimmte Tasten (z.B. Pfeiltasten, Num-Block, etc) ein Event auslöst.
Ich hab mir alles, was ich dazu hier im Forum oder unter Google gefunden hab reingezogen (GetKeyState(), OnKeyDown() und der Rest) aber ich versteh nur bahnhof.
Gibts nicht irgendwo einen einfachen 3 Zeiler, der mir das so schnell verdeutlichen kann?
-
Wasmeinst Du mit dreizeiler?
Deine Angaben sind unklar!
1. Willst Du das Applikationsübergreifend. Dann brauchst Du einen Hook
2. Geht es nur um den View Deiner SDI/MDI Applikation. Dann brauchst Du nur einen simplen OnKeyDown Handler. (WM_KEYDOWN)
3. Übergreifend in einem Dialog für alle darin enthaltenen Controls. Dann musst Du PreTranslateMessage verwenden.Was willst Du?
-
ich will 2.
Ok hast recht, ich war sparsam mit meinen wüschen.
Ich will mit einem Tastendruck (z.B. VK_UP) in meinem Dialog ein Event (z.B. MessagBox zum testen) aktivieren. Kein schnickschnak mit "fenster ist im Hintergrund" oder "Dialogübergreifend". Einfach, Simpel und Funktionell.
So in etwa:
if(taste "bla" gedrückt)
{
Mach was;}
-
Hi
Ich glaube, das hier entspricht deinen Wünschen:
MSG message; if(::PeekMessage(&message, NULL, 0, 0, PM_REMOVE)) { ::TranslateMessage(&message); if(message==VK_UP) { MachWas(); } return; }
-
Nein! Das entspricht sicherlich nicht seinen Wünschen.
Er hat ein SDI Fenster. Er braucht nichts anderes als einen entsprechenden WM_KEYDOWN Handler einzubauen. Trivialstes Windows Programmieren.
-
Martin hat recht. Ist SEHR primitiv. Ich habs auch mitlerweile hinbekommen, dass ich halt mit der Funktion OnKeyDown() tasten abfragen kann. Hab auch gelesen,dass dazu die Buttons im Dialog Deaktiviert sein MÜSSEN.
Nur irgendwie wollen die Cursor-Tasten, num-Block und Tasten wie "Space", "alt" etc nicht anspringen.
Toll wäre auch, wenn ich die Buttons aktiv lassen könnte, aber das ist erstmal zweit-rangig.
-
Also, ich würde es mit PreTranslateMessage im MainFrame lösen.
// Wurde eine Taste gedrückt? if (pMsg->message == WM_KEYDOWN) { UINT nKeyCode = pMsg->wParam; // virtual key code of the key pressed // ...Oder du versuchst es erstmal zusätzlich zu WM_KEYDOWN mit WM_SYSKEYDOWN.

-
so ich wieder..
Ich habs mit dem WM_SYSKEYDOWN versucht, aber er nimmt trotzdem keine Cursortasten (und andere Systemtasten an). Liegt das daran, dass ich nen Dialog starte? Hab zwar alle Elemente Deaktiviert, aber ich weiß trotzdem nicht weiter.Bei den VK_NUM-Tasten will er nichtmal komplielieren. VK_NUM<ZAHL> ist doch richtig oder?
Bsp:
void CTestDlg::OnSysKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) { if(nFlags == VK_SPACE) MessageBox(_T("test"),_T("space"), NULL); CDialog::OnSysKeyDown(nChar, nRepCnt, nFlags); }
-
Cursor-Tasten wie auch die VK_ENTER Taste frisst der PreTranslateMessage Handler des Dialoges. Du müsstest Sie aber dennoch bekommen, wenn Du einen PreTranslateMessage Handler ist. Im Diaog selbst kommen die nicht an!
Hat Dein Dialog keine Controls?
Was ist das für ein Konstrukt? Wo willst Du denn die Tasten abfangen und für was?
-
Mit meinem Programm will ich Bytes an eine Funktion schicken, die dann übern USB einen schrittmotor betreiben. Klappt auch wunderbar. Ich klicke den Button und schwubs drehen sich die motoren und das senden wird mit einem Timer automatisch fortgeführt.
Nun will ich das aber auch so haben, dass ich mit den Cursortasten ODER den NUM-Block auch die Events auslösen kann. Nur wenn ich die Buttons nicht deaktiviere, nimmt er mit OnKeyDown() nicht die tasten an (habs erstmal mit normalen Buchstaben probiert).
Mit dem PreTranslateMessage handler selber hab ich direkt noch ncihts gemacht, weil ich nicht genau weiß, wo ich den reinpacken bzw, abholen muss.
-
Habs gefunden:
BOOL CDlgDrawDlg::PreTranslateMessage(MSG* pMsg) { // TODO: Speziellen Code hier einfügen und/oder Basisklasse aufrufen // Falls Taste gedrueckt wurde if (pMsg->message == WM_KEYDOWN) { // Wenn ESCAPE, dann Nachricht verwerfen if (pMsg->wParam == VK_ESCAPE) // Nachricht verwerfen! return 1; // Wenn RETURN, dann nach TAB umwandeln if (pMsg->wParam == VK_RETURN) pMsg->wParam = VK_TAB; } // Standard-Behandlung durchfuehren return CDialog::PreTranslateMessage(pMsg); }