Veröffentlicht 28. August 200124 j So, ich nochmal, gibet irgendeine möglichkeit, einen tastendruck abzufangen und dann zu unterscheiden, ob die rechte Entertaste oder die in der Mitte gedrückt wurde? Accelerator hilft mir da net so viel oder?
28. August 200124 j Naja, also für die beiden Entertasten gibt es nur eine Virtualkey-Konstante: VK_ENTER. Deswegen kannst du für die beiden Tasten nicht unterschiedliche Acceleratoen definieren. Aber es gibt trotzdem eine Möglichkeit, zwischen den Tasten zu unterscheiden , und zwar in der Fensterprozedur. Du reagierst in der Fensterprozedur auf die Nachricht WM_KEYDOWN. Dort überprüfst du, ob wParam == VK_ENTER. Wenn das der Fall ist, schaust du, ob im lParam das Flag KF_EXTENDED gesetzt ist. Ist auch dies der Fall, so handelt es sich um die "erweiterte" Enter-Taste, also die im NumPad-Block. Nochmal als Quellcode: LRESULT WINAPI WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { switch (Msg) { //... case WM_KEYDOWN: if (wParam == VK_ENTER) { if (lParam & KF_EXTENDED) // Entertaste rechts unten gedrückt else // "normale" Entertaste gedrückt } break; //... } //... } Viel Spaß beim Werkeln!
28. August 200124 j Hmm, klingt einleuchtend, aber von welcher Fensterprozedur sprichst du? Ich hab nur Klassen?!? :confused: :confused: und davon noch so viele?!?!
29. August 200124 j Demnach schreibst du das mit MFC? Dann musst du mit dem Class Wizard für das entsprechende Fenster einen Windows-Message Handler für das WM_KEYDOWN-Ereignis erstellen, in dem du dann folgendes tust: void [i](OBJECT)[/i]::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) { // TODO: Add your message handler code here and/or call default if ((nChar == VK_RETURN) && (nFlags & 0x100)) // erweiterte Entertaste else // normale Entertaste [i](Vorige Instanz)[/i]::OnKeyDown(nChar, nRepCnt, nFlags); }
29. August 200124 j hmm, amazing. Irgendwie tut der garnix. sicher das das flag 0x100 sein muß? Ich hab das jetzt genau so gemacht, ich mein, das kling ja auch einleuchtend. Ich habs zu sicherheit mal überall ausprobiert, aber selbst wenn ich in WM einen Haltepunkt setze und dann debugge komme ich nie dorthin. :confused: :confused:
29. August 200124 j Also, tach nochmal! Ich hab mir jetzt mal den MFC-Sourcecode angeschaut, die Nachricht WM_KEYDOWN mit wParam = VK_RETURN wird vom Programmgerüst oft abgefangen. Aber an der richtigen Stelle kann man trotzdem unterscheiden , du musst nämlich die Methode PreTranslateMessage(MSG* lpMsg) überschreiben, dann klappts, z. B.: BOOL CMainFrame::PreTranslateMessage(MSG* pMsg) { // TODO: Add your specialized code here and/or call the base class if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN) { if (pMsg->lParam & 0x01000000) AfxMessageBox("numpad enter tastendruck!"); else AfxMessageBox("normaler enter tastendruck!"); } return CFrameWnd::PreTranslateMessage(pMsg); } Hab's nochmal ausprobiert, es funktioniert.
Archiv
Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.