"Alt + X" Taste abfangen?



  • Nicht

    ON_COMMAND(IDR_ACCELERATOR1, OnAcc)
    

    !!!!!!!

    Sondern hier musst Du die ID des speziellen Accelerators angeben!!!

    Also z.B. ID_MYACCELERATOR1
    den Du zuvor in den Ressourcen definiert hast (in einer Zeile):

    ID_MYACCELERATOR1 Ctrl A VIRTKEY

    Also:

    ON_COMMAND(ID_MYACCELERATOR1, OnAcc)
    

    Wenn Du es so lässt wie jetzt, dann gibt es nur Probleme, weil es ja bei JEDEM Acc jetzt ausgeführt wird (also falls mal Dein Menü einen Acc hat wird die Methode auch aufgerufen!)



  • Dialoge rufen standardmäßig nicht die Accelatoren auf, das mußt du ihnen schon selber beibringen:

    Jochen Kalmbach schrieb:

    Siehe auch:
    http://www.codeproject.com/dialog/pretransdialog01.asp

    (der Abschnitt "Using ProcessMessageFilter to handle dialog-based accelerator keys" dürfte für dich interessant sein)



  • CStoll schrieb:

    Dialoge rufen standardmäßig nicht die Accelatoren auf, das mußt du ihnen schon selber beibringen

    Das hat er ja jetzt genau nach Nishs Anweisung gemacht 😉 Nur in dem CP articel fehlt leider, wie man denn die Methoden für einen Accelerator definiert...



  • Hi,
    @panschev, macht nichts, es war nur ein beispiel für tasten, aber funktionieren tut es icht? 😕

    BOOL CDialogDlg::PreTranslateMessage(MSG* pMsg )
    {
    
    	if ((GetAsyncKeyState(VK_CONTROL)) && (GetAsyncKeyState('D')))
    			AfxMessageBox(L"");
    
    	if(pMsg->message==WM_KEYDOWN)
    	{
    
    		//if ((GetAsyncKeyState(VK_CONTROL)) && (GetAsyncKeyState('D')))
    		//	AfxMessageBox(L"");
    
    		if(pMsg->wParam == VK_DELETE)
    		{
    			if(IDYES == AfxMessageBox(L"Löschen Ergebnisse?!", MB_YESNO))
    				this->OnClear();
    
    		}
    	}	
    
    	return CDialog::PreTranslateMessage(pMsg);
    }
    

    @jochen,
    fehlt hier bei mir ein ::SendMessage()???

    😕 😕 😕 😕
    mfg



  • Was hat denn jetzt dieses Posting mit meinem Vorschlag zu tun? Wo sind hier die Acceleratoren?



  • Hallo Jochen,
    jetzt hab ichs richtig gemacht!!!
    Sorry, ich hab dich zu erst falsch verstanden gehabt mit dem IDR_ACCELERATOR1 den ich beim ersten versucht habe!

    Das läuft jetzt!

    BEGIN_MESSAGE_MAP(CDialogApp, CWinApp)
    	//{{AFX_MSG_MAP(CDialogApp)
    		// NOTE - the ClassWizard will add and remove mapping macros here.
    		//    DO NOT EDIT what you see in these blocks of generated code!
    	//}}AFX_MSG
    	ON_COMMAND(ID_HELP, CWinApp::OnHelp)
    	ON_COMMAND(ID_ACC, OnAcc) // ID_ACC, ist der Wert aus dem Accelerator( den ich bis jetzt versucht habe -> IDR_ACCELERATOR1
            // ON_COMMAND(IDR_ACCELERATOR1)
    END_MESSAGE_MAP()
    

    Danke noch mal !
    pixel



  • Hi nochmal,

    Sondern hier musst Du die ID des speziellen Accelerators angeben!!!

    Also z.B. ID_MYACCELERATOR1
    den Du zuvor in den Ressourcen definiert hast (in einer Zeile):
    ID_MYACCELERATOR1 Ctrl A VIRTKEY // den hab ich genommen!!!!

    Jetzt gehts!
    mfg
    pixel



  • Super!!! Und jetzt ist es auch "richtig" gelöst...



  • ja 🤡

    *lol*



  • Hallo,

    zur Info, ich wollte eine bestimmte Tastenkombination abfangen, wie z.B. Alt + C, es klappt auch fast richtig, nur:
    Es wird manchmal ein Fehler angezeigt beim schliessen über den x-Button, im System Menu, des Dialogs? 😕

    Und das auch nicht immer, dass ist die Fehlerzeile auf die gezeigt wird:

    BOOL CDialogApp::ProcessMessageFilter(int code, LPMSG lpMsg)
    {
    	if(m_haccel)
    	{
    		if (::TranslateAccelerator(m_pMainWnd->m_hWnd, m_haccel, lpMsg)) // hier wird Fehler angezeigt, das ist die line 86 im Programm!!! 
    		{
    			return(TRUE);
    		}
    		else
    			return(FALSE);
    	}
    
    	return CWinApp::ProcessMessageFilter(code, lpMsg);
    }
    

    Die Fehlermeldung ist:

    Unhandled exception in ProgrammName.exe: 0x0000005: Access Violation
    // Der Stack zeigt auf:
    CDialogApp::ProcessMessageFilter(int 0, tagMSG * 0x0012f2fc {msg=0x00008002 wp=0x00000000 lp=0x00000000}) line 86 + 22 bytes

    Kann ich das irgendwie abfangen, wenn der benutzer auf den Schliessen 'X' Button klickt dass dann keine Prozessmessage aufgerufen wird?

    Grüsse
    pixel



  • Hallo,
    keiner eine Idee wie ich diesen 'X' abfangen kann ohne dass der Accelerator sich meldet?! 😞

    mfg
    pixel


Anmelden zum Antworten