Tasten-Nachrichten kommen nicht an
-
Hallo!
Ich habe eine Anwendung, bei der einige Befehle per Menü und per Tastatur erreichbar sind.
- Esc: Abbrechen
- F10: Speichern
- F9: Speichern und weiter
Die ersten beiden haben mal funktioniert und neuerdings tun sie es nicht mehr.
Ich habe schon mit Spy++ geguckt, bei F10 fühlt sich das Menü angesprochen, die anderen beiden bewirken nix.
Wo biegen die falsch ab?
Der Cursor steht in einem von CEdit abgeleiteten Control.
PS: Funktioniert aber auch bei anderen Controls nicht.Es ist eine SDI mit Formviews.
-
Hast Du einen Accelerator definiert?
Hast Du eine eigene PreTranslateMessage Funktion, die evtl. den default nicht aufruft?F10 löst immer das Systemmenü für die Keyboardeingabe aus. Das ist Standard!
-
Martin Richter schrieb:
Hast Du einen Accelerator definiert?
Ja.
Hast Du eine eigene PreTranslateMessage Funktion, die evtl. den default nicht aufruft?
Nicht dass ich wüsste, ich habe schon gesucht. (Nach VK_F9)
F10 löst immer das Systemmenü für die Keyboardeingabe aus. Das ist Standard!
Wie werde ich das los? (Es ging doch schon mal...)

-
Wie sieht Dein PreTranslateMessage aus?
Imho frisst die Standfard Implementierung der CFormView::PreTranlateMessage (IsDialogMessage) die Tastatureingaben.
-
Ich habe das mal so gelöst wie in dem nachfolgenden Beispiel.
CDialogView ist auch ein CFormView und ich habe in der MDI APplikation auf dem MDI Child bzw. im Mainframe Acceleratoren!
Deshalb bekommen die Parents Tastatureingaben zuerst angeboten.BOOL CDialogView::PreTranslateMessage(MSG* pMsg) { ASSERT(pMsg != NULL); ASSERT_VALID(this); ASSERT(m_hWnd != NULL); // don't translate dialog messages when in Shift+F1 help mode CFrameWnd* pFrameWnd = GetTopLevelFrame(); if (pFrameWnd != NULL && pFrameWnd->m_bHelpMode) return FALSE; // since 'IsDialogMessage' will eat frame window accelerators, // we call the frame window's PreTranslateMessage first if ((pFrameWnd = GetParentFrame()) != NULL) { if (pFrameWnd->PreTranslateMessage(pMsg)) // eaten by frame accelerator return TRUE; // check for parent of the frame in case of MDI if ((pFrameWnd = pFrameWnd->GetParentFrame()) != NULL && pFrameWnd->PreTranslateMessage(pMsg)) // eaten by frame accelerator return TRUE; } /* filter both messages to dialog and from children * but only if there is a Child that has the Focus, * if all children are Disabled, and CDialog has the Focus * IsDialogMessage will eat all WM_KEYDOWN and WM_SYSKEYDOWN */ if (pMsg->message >= WM_KEYFIRST && pMsg->message <= WM_KEYLAST && ::IsChild(m_hWnd,::GetFocus())) // OK allow to eat it return ::IsDialogMessage(m_hWnd, pMsg); return FALSE; }
-
Moin!
Also ich habe mich daran jetzt mal versucht:
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 switch (nKeyCode) { case VK_ESCAPE: SendMessage(WM_COMMAND, ID_BEARBEITEN_ABBRECHEN); break; case VK_F9: SendMessage(WM_COMMAND, ID_BEARBEITEN_SPEICHERN_NEU); break; default: break; } } else if (pMsg->message == WM_SYSKEYDOWN) { SendMessage(WM_COMMAND, ID_BEARBEITEN_SPEICHERN); } return CFrameWnd::PreTranslateMessage(pMsg); }Das funktioniert soweit schon ganz gut, ich muss jetzt mal gucken, welche Tasten noch alle behandelt werden müssen.

Leider hat das WM_SYSKEYDOWN einen Haken: Nicht nur F10 sondern auch die Alt-Taste laufen in diese if.

Wie gucke ich nun, ob es die F10 Taste war?
-
Ich mag Acceleratoren lieber, als dieses handgestrickte.
Dein Code berücksichtig nicht das Umschalt/Strg/Alt gedrückt wurden.
-
Martin Richter schrieb:
Ich mag Acceleratoren lieber, als dieses handgestrickte.
Dein Code berücksichtig nicht das Umschalt/Strg/Alt gedrückt wurden.Ich mag sie ja auch lieber, aber sie funktionieren doch nicht mehr, deswegen doch meine Frage gestern.

Das mit der Alt Taste habe ich jetzt so:
else if ((pMsg->message == WM_SYSKEYDOWN) && (GetAsyncKeyState(VK_F10)))