Funktionstaste F10
-
Wenn man bei einem laufenden, in MFC generiertem Programm die F10-Taste betätigt, dann wird das Untermenue aufgerufen (nebenbeibemerkt, Die F1-Taste ruft das Help-Menue auf). Hat man aber in seiner Anwendung kein Menue eingebunden - so wie ich - und drückt dann die F10-Taste, dann "wartet" das Programm auf die nächste Tasten-Aktion (oder Maus-Klick-Aktion) bevor es wieder "normal" arbeiten kann. Nun benötige ich aber die F10-Tast um in meinem Programm ein bestimmtes Ereignis auszulösen. Durch das Betätigen der F10-Taste wird mein gewünschtes Ereignis ausgelöst, aber ich muss dem "wartenden" Rechner zunächst einen Tasten-Druck oder Mausklick geben bevor ich z.B. in ein Editor-Steuerelement schreiben kann. Weiss jemand Rat?
-
Also, ich nutze auch F10 und das geht einwandfrei.
Hast du die alte Tastenbelegung vielleicht vergessen zu löschen? Debug doch mal, wo er da lang geht und versuch ihm das abzugewöhnen. Wenns nicht geht, beschreib mal, wo er sich rumtreibt.
PS: Kenne die Belegung mit Untermenü nicht...
-
Hi,
was meinst du mit "Löschen der Tastenbelegung"? Ich fange die F10-Taste übrigens mit folgendem Code ab.BOOL CMyDlg::PreTranslateMessage(MSG* lpmsg) { if( (lpmsg->wParam == VK_F10) //tue was return CDialog::PreTranslateMessage(lpmsg); }Ich wüsste nicht wo ich debugen soll - es scheint alles OK zu sein, bis auf dass ich nach einem F10-Tastendruck irgendeine beliebige Taste (oder Mausklick) betätigen muss bevor ich an meine Steuerelemente zugreifen kann

-
Hast du schon mal im Accelerator Table geguckt?
-
Nein noch nicht aber das was ich eben kurz überflogen habe scheint schwere Kost zu sein... Hast du vielleicht einen weiteren Tip ?
-
Schwere Kost?
Steht da irgendwo was mit F10 (VK_F10)? Wenn ja, dann kopier die Zeile mal hier rein.
Wenn nicht, dann müsstest du mir mal die gesamte Accelerator Table zukommen lassen. Die ist aber eigentlich nicht sehr kompliziert.
-
Vielen Dank für deine Tips, aber irgendwie komme ich so nicht weiter. Ich werde mal 'ne Pause machen und es später nochmal versuchen
-
Hab was dazu in meinem Lieblingsbuch gefunden:
IDR_MAINFRAME ACCELERATORS PRELOAD MOVEABLE BEGIN "N", ID_FILE_NEW, VIRTKEY,CONTROL "O", ID_FILE_OPEN, VIRTKEY,CONTROL "S", ID_FILE_SAVE, VIRTKEY,CONTROL "Z", ID_EDIT_UNDO, VIRTKEY,CONTROL "X", ID_EDIT_CUT, VIRTKEY,CONTROL "C", ID_EDIT_COPY, VIRTKEY,CONTROL "V", ID_EDIT_PASTE, VIRTKEY,CONTROL VK_BACK, ID_EDIT_UNDO, VIRTKEY,ALT VK_DELETE, ID_EDIT_CUT, VIRTKEY,SHIFT VK_INSERT, ID_EDIT_COPY, VIRTKEY,CONTROL VK_INSERT, ID_EDIT_PASTE, VIRTKEY,SHIFT ENDIn this example, IDR_MAINFRAME is the accelerator table's resource ID. PRELOAD and MOVEABLE are load options that, like the equivalent keywords in MENU statements, have no effect in the Win32 environment. Each line in the table defines one accelerator. The first entry in each line defines the accelerator key, and the second identifies the corresponding menu item. The VIRTKEY keyword tells the resource compiler that the first entry is a virtual key code, and the keyword following it—CONTROL, ALT, or SHIFT—identifies an optional modifier key. In this example, Ctrl-N is an accelerator for File-New, Ctrl-O is an accelerator for File-Open, and so on. The Edit menu's Undo, Cut, Copy, and Paste functions each have two accelerators defined: Ctrl-Z and Alt-Backspace for Undo, Ctrl-X and Shift-Del for Cut, Ctrl-C and Ctrl-Ins for Copy, and Ctrl-V and Shift-Ins for Paste.
Vielleicht hilft dir das weiter. Aber Pause ist auch immer gut - da habe ich immer die besten Ideen...

-
Versuch doch mal dies:
BOOL CMainFrame::PreTranslateMessage(MSG* pMsg) { // TODO: Add your specialized code here and/or call the base class if (pMsg->message == WM_KEYDOWN || pMsg->message == WM_SYSKEYDOWN) { if ((int)pMsg->wParam >= VK_F1 && (int)pMsg->wParam <= VK_F12) { // machwas } } return CFrameWnd::PreTranslateMessage(pMsg); }Grüße,
LukeX
-
q150022 schrieb:
Hi,
was meinst du mit "Löschen der Tastenbelegung"? Ich fange die F10-Taste übrigens mit folgendem Code ab.BOOL CMyDlg::PreTranslateMessage(MSG* lpmsg) { if( (lpmsg->wParam == VK_F10) //tue was return CDialog::PreTranslateMessage(lpmsg); }Ich wüsste nicht wo ich debugen soll - es scheint alles OK zu sein, bis auf dass ich nach einem F10-Tastendruck irgendeine beliebige Taste (oder Mausklick) betätigen muss bevor ich an meine Steuerelemente zugreifen kann

Ist so was nicht gut:
BOOL CMyApp::PreTranslateMessage(MSG* lpmsg) { if(lpmsg->wParam == VK_F10){ //tue was return true; } return CWinApp::PreTranslateMessage(lpmsg); }