Message-Loop



  • Hallo miteinander,

    ich versuche gerade in C#, die Message Keydown des Fensters auf bestimmte Eingabe hin zu unterzuchen, z.B. die Tasten UP, DOWN, RIGHT,...

    Im KeyDown-Event tauchen diese nicht auf, obwohl ich die Eigenschaft KeyPreview auf TRUE gestellt habe.

    Gibt es irgendwo einen Hinweis, wie ich diese Tasten erkennen kann?

    Vielen Dank vorab. 😃



  • Im KeyDown Event. 😉
    Ist vlt. was an Deinem Code falsch?



  • Ganz bestimmt mache ich was falsch, ich weiß nur nicht wo.

    Ein Überschreiben des Event-Handlers

    protected override void OnKeyDown(KeyEventArgs e)
            {
                //.....
            }
    

    oder das Abonnieren des KeyDown-Event

    void WizMain_KeyDown(object sender, KeyEventArgs e)
            {
                if (WizMenu != null) WizMenu.HandleMenuEvents(e.KeyData);
            }
    

    (natürlich habe ich das Abonnement auch korrekt eingetragen)
    zeigt in keiner Variante die Ereignisse für UP, DOWN, RIGHT oder LEFT, andere Ereignisse wie Buchstaben, Ziffern F-Tasten, Modifier-Tasten schon.

    Bei den Recherchen habe ich inzwischen herausgefunden, dass gerade diese Cursor-Codes für andere Steuerungszwecke 'abgegriffen' werden, aber ich möchte die Cursor-Tasten für eigene Zwecke verwenden.

    Gibt es noch eine andere Möglichkeit, gerade diese KeyDown-Ereignisse abzugreifen, bevor .NET das tut?



  • Mit dieser Funktion erwische ich die von den Cursor-Tasten ausgelösten Ereignisse

    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
            {
                const int WM_KEYDOWN = 0x100;
    
                if (msg.Msg == WM_KEYDOWN)
                {
                    System.Windows.Forms.MessageBox.Show("KEYDOWN: 0x" + Microsoft.VisualBasic.Conversion.Hex((int)(msg.WParam)));
                }
                return base.ProcessCmdKey(ref msg, keyData);
            }
    

    -- aber den ALT-F4 kann ich immer noch nicht abfangen ......



  • WishfulThinking schrieb:

    System.Windows.Forms.MessageBox.Show("KEYDOWN: 0x" + Microsoft.VisualBasic.Conversion.Hex((int)(msg.WParam)));
    

    Ich bin ja auch nen VB-Fan … aber die VB6-Kompatibilitäts-Bibliothek verwende ich selbst in VB nicht. Wieso man sie explizit in C# einbinden sollte, verschließt sich mir.

    Wieso verwendest Du nicht einfach die korrekte 'ToString'-Methode der int-Klasse?

    ((int)msg.WParam).ToString("X");
    


  • Naja, Du hast vollkommen Recht. 👍

    Aber wie man ja auch sehen kann, diente die Ausgabe nur zu Testzwecken und war ein Schnellschuß, für den es leicht eine bessere Methode gibt. Für das 'Endprodukt' wird der Code bestimmt effektiver. 😃



  • Ok, jetzt habe ich es:

    Mit der Funktion "ProcessCmdKey" erwische ich alle Eingaben von der Tastatur.


Anmelden zum Antworten