"Alt + X" Taste abfangen?



  • 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