Net-srac Geschrieben 28. August 2001 Geschrieben 28. August 2001 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? Zitieren
MadMatrix Geschrieben 28. August 2001 Geschrieben 28. August 2001 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! Zitieren
Net-srac Geschrieben 28. August 2001 Autor Geschrieben 28. August 2001 Hmm, klingt einleuchtend, aber von welcher Fensterprozedur sprichst du? Ich hab nur Klassen?!? :confused: :confused: und davon noch so viele?!?! Zitieren
MadMatrix Geschrieben 29. August 2001 Geschrieben 29. August 2001 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); } Zitieren
Net-srac Geschrieben 29. August 2001 Autor Geschrieben 29. August 2001 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: Zitieren
MadMatrix Geschrieben 29. August 2001 Geschrieben 29. August 2001 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. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.