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.


  • Mod

    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...)
    😕


  • Mod

    Wie sieht Dein PreTranslateMessage aus?
    Imho frisst die Standfard Implementierung der CFormView::PreTranlateMessage (IsDialogMessage) die Tastatureingaben.


  • Mod

    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? 😕


  • Mod

    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)))
    

Anmelden zum Antworten