Tastenkombinationen abfangen???



  • Hallo zusammen,

    Ich habe mal eine Frage. In meiner Firma setzen wir unsere eigene Software ein um unsere Maschinen zu bedienen. Diese Software wird von mir in VC++ 6.0 programmiert.

    Jetzt möchte mein Chef, das die Benutzer diese Programm nicht mehr über eine Tastenkombination schliessen können, da sonst die Maschine nicht mehr richtig arbeitet.

    Ich habe auch schon mittels
    RegisterHotKey(GetSafeHwnd(), m_nHotKeyID + 1, MOD_ALT, VK_F4);
    die Kombination alt-f4 abgefangen. Aber mein Softwaretester hat nun einen weitere Abgrund aufgetan...

    Durch drücken der Tastenkombination ctrl-pause bzw. ctrl-scrolllock lässt sich die Software ebenfalls schliessen.

    Ich habe bereits mit RegisterHotKey versucht diese Kombinationen wie oben anzufangen, jedoch greift dies bei den beiden nicht.
    Ausserdem habe ich bereits versucht die Tasten über die PreTranslateMessage beim WM_KEYDOWN und WM_KEYFIRST sowie WM_KEYLAST event abzufangen und zu unterdrücken, alles ohne erfolg.

    Ich wende mich daher an Euch, vielleicht weis jemand eine Möglichkeit diese kombinationen vor dem System abzufangen und zu verarbeiten.

    Vorweg schon einmal vielen Danke für Eure Bemühungen.

    Grüße Steyen



  • Vielleicht ist es ein WM_SYSKEY_DOWN?



  • Du meinst bei PreTranslateMessage???



  • Genau. 🙂



  • Habs versucht, aber:

    error C2065: 'WM_SYSKEY_DOWN' : nichtdeklarierter Bezeichner



  • steyen schrieb:

    Habs versucht, aber:

    error C2065: 'WM_SYSKEY_DOWN' : nichtdeklarierter Bezeichner

    Vermutlich weil dort ein Unterstrich zu viel ist - WM_SYSKEYDOWN sollte passen.



  • OK, danke so bringt er den Fehler nicht mehr, hätte auch selber drauf kommen können *grin*...

    Aber er wird nicht abgefangen.

    Hier mal mein Auszug der funktion

    if ((pMsg->message == WM_KEYDOWN) && (pMsg->wParam == VK_SCROLL))
    {
    return 0;
    }

    if ((pMsg->message == WM_SYSKEYDOWN) && (pMsg->wParam == VK_SCROLL))
    {
    return 0;
    }

    die 1. If abfrage reagiert auf die scrollen taste, aber wenn ich die kombination strg-scrollen drücke wird mein Programm abgebrochen und nicht nur in der IDE sonder auch zur Laufzeit.

    Gruß Steyen



  • Ich hatte mal ein ähnliches Problem. Musste man da nicht auch lParam auswerten? Immer wenn man Shift, Alt oder Ctrl zusätzlich zu einer Taste drückt dann war da glaub ich auch noch eine Info drin. Kann aber sein ich vertue mich da.
    2. Ansatz:

    void C...View::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
    {
    	// TODO: Fügen Sie hier Ihren Meldungsbehandlungscode ein, und/oder benutzen Sie den Standard.
    	if( ( ::GetKeyState( VK_SHIFT ) < 0) && ( ::GetKeyState( VK_F4 ) < 0) ) 
        MessageBox("Shift+F4 wurde gleichzeitig gedrückt."); 
    
    	CView::OnKeyDown(nChar, nRepCnt, nFlags);
    }
    

    Mit GetKeyState kann man den Status dieser Tasten abfragen. Bei Systemtasten ist der negativ. Aber Alt kann man da glaub ich nicht abfangen.
    Ist nur so eine Idee...

    Edit:
    Beim Drücken der Alt-Taste wird eine WM_SYSKEYDOWN losgelassen. Auf Alt+F4 kann man so raegieren:

    BOOL C...View::PreTranslateMessage(MSG* pMsg)
    {
    	// TODO: Fügen Sie hier Ihren spezialisierten Code ein, und/oder rufen Sie die Basisklasse auf.
    	if (pMsg->message == WM_SYSKEYDOWN)
    	{
    		if (pMsg->wParam == VK_F4)
    		{
    			AfxMessageBox("Alt+F4 gedrückt");
    		}
    	}
    
    	return CView::PreTranslateMessage(pMsg);
    }
    


  • Danke das werde ich sofort ausprobieren.

    Super Forum hier, wird sofort geholfen.

    Ich hoffe ich kann vielleicht auch mal jemanden helfen.

    Gruß Steyen



  • Hi,

    ich bin zwar noch recht neu hier, aber der letzte Codeschnipsel würde glaube ich auch beispielsweise bei CTRL+F4 die messagebox ausgeben. Ob dieses Verhalten tolerierbar ist weiß ich nicht, es könnte ja sein, dass das ein shortcut im Programm ist 😉 Es ist also mindestens der Ausgabetext der Messagebox irreführend 😉 Ich vermute es gibt eine spezielle Möglichkeit, bei wm_syskeydown noch genauer zu schauen, welche Taste es ist.

    Herzliche Grüße

    Johannes



  • Hallo nochmal an alle die sich bisher mit Antworten gemeldet haben.

    Ich benötige nur die Kombinationen Ctrl-Pause und Ctrl-Scrolllock, die anderen kann ich schon alle abfangen, d.h. aus meinem Programm kann man nicht mehr ausbrechen (Deaktiviert: Taskmanager, Windows taste, ctrl-escape, alt-f4, ctrl-alt-del, alt-tab, escape, ...)

    Aber diese dumme direktive Ctrl-Pause und Ctrl-Scrolllock wird unterhalb des von mir zu überwachenden Codes aktiviert und schliesst bevor mein Code greifen kann meine Anwendung.

    Für weitere Vorschläge bin ich jederzeit offen.

    Danke nochmal an alle.

    Gruß Steyen



  • JG321 schrieb:

    Hi,

    ich bin zwar noch recht neu hier, aber der letzte Codeschnipsel würde glaube ich auch beispielsweise bei CTRL+F4 die messagebox ausgeben. Ob dieses Verhalten tolerierbar ist weiß ich nicht, es könnte ja sein, dass das ein shortcut im Programm ist 😉 Es ist also mindestens der Ausgabetext der Messagebox irreführend 😉 Ich vermute es gibt eine spezielle Möglichkeit, bei wm_syskeydown noch genauer zu schauen, welche Taste es ist.

    Herzliche Grüße

    Johannes

    Probiers aus, dann siehst Du, dass es nicht so ist. Ctrl gibt eine WM_KEYDOWN ab, während Alt eine WM_SYSKEYDOWN meldet. Somit ist das schon mal unterscheidbar. Ich gebe Dir natürlich Recht das man das genauer unterscheiden soll. Das sollte ja auch nur ein Ansatz zum zeigen sein.



  • Hast du mal beobachtet, welche Nachrichten überhaupt als Reaktion auf Ctrl+Scroll und Ctrl+Pause an deine Anwendung geschickt werden? (Spy++ könnte helfen)

    Eventuell könnten auch WM_CLOSE oder WM_SYSCOMMAND(SC_CLOSE) weiterhelfen.



  • AndyDD schrieb:

    Probiers aus, dann siehst Du, dass es nicht so ist. Ctrl gibt eine WM_KEYDOWN ab, während Alt eine WM_SYSKEYDOWN meldet. Somit ist das schon mal unterscheidbar. Ich gebe Dir natürlich Recht das man das genauer unterscheiden soll. Das sollte ja auch nur ein Ansatz zum zeigen sein.

    Hiho,

    jo du hast Recht. Sorry.

    Herzliche Grüße

    Johannes



  • Hallo an Alle,

    also es hat sich erledigt, habe die Antwort selber gefunden und wie es so oft im Leben ist, war auch dieses Problem nicht so tiefgreifend wie angenommen.

    Um die Tastenkombination Ctrl-Break und Ctrl-Scroll abzufangen, muss man lediglich, man höre und staune ... die OnCancel() Funktion aufnehmen und dann das weiterleiten an Dialog verhindern und schon sind Escape, alt-f4, ctrl-Break, ctrl-scroll, ... abgefangen.

    Im Header:
    //{{AFX_MSG(CCapTestDlg)
    virtual void OnCancel();
    //}}AFX_MSG
    und im CPP:

    void CTest2::OnCancel()
    {
    // TODO: Zusätzlichen Bereinigungscode hier einfügen

    //CDialog::OnCancel(); <==Wichtig hier kommentieren
    }

    Ich danke nochmals allen, die sich dazu Gedanken gemacht habe und hoffe, dass ich so auch vielen anderen weiterhelfen konnte.

    Grüße Steyen


Log in to reply