none
Stehe auf dem Schlauch,,, RRS feed

  • Frage

  • Hallo zusammen.

    Ich sitze seit langem mal wieder am PC und programmiere. Nun habe ich eine Frage von der ich schon fast "Angst" habe diese zu stellen. Ich habe in VB einfach ein neues Projekt gestartet und möchte einfach auf das Drücken einer Taste reagieren:

    Public Class Form1
    
        Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        End Sub
    
        Private Sub Form1_KeyPress(sender As System.Object, e As System.Windows.Forms.KeyPressEventArgs) Handles MyBase.KeyPress
            MsgBox("Taste")
        End Sub
    End Class
    

    Leider passiert nichts wenn ich das Programm starte und auf eine Teste drücke. Kann mir bitte jemand ein paar Bäume aus dem Weg räumen?!?

    Danke

    Jan

    Samstag, 14. Dezember 2013 16:29

Antworten

  • Hallo,
    das geht nicht wirklich einfacher. Windows Forms benutzt großteilig die originalen Windows Controls. Dort wird jedes Control als ein art eigenes Fenster betrachtet. Zuerst wird der Form bescheit gegeben (IMessageFilter), danach wird es dem Control gesagt, das aktuell den Fokus hat. Und dieses Control entscheidet dann ob es die Nachricht weiter reicht oder nicht. Das machen die Controls aber normalerweise nicht.

    In der If-Abfrage kannst du einfach den Tasten-Code prüfen:

        Function PreFilterMessage(ByRef m As Message) As Boolean Implements IMessageFilter.PreFilterMessage
            If m.Msg = &H100 Then 'KeyDown abfangen (WM_KEYDOWN)'
                Dim key As Keys = CType(m.WParam, Keys) 'Die Taste abfragen'
                Select Case key'Entscheiden was passieren soll'
                    Case Keys.F1
                        Button1.PerformClick() 'Click simulieren'
                        Return True 'Meldung nicht weiter reichen'
                        'usw. mit den anderen Button'
                End Select'Andere Meldungen werden naach dem if-Abfrage einfach weiter gereicht'
            End If
            Return False 'Andere Meldungen bzw. Tasten ignorieren'
        End Function

    Das empfinde ich nun nicht als sonderlich schwer oder schreibaufwendig, da es am Ende bestenfalls nur noch 3 Zeilen pro Taste sind.


    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.


    Sonntag, 15. Dezember 2013 11:45

Alle Antworten

  • Hallo,
    solange die Form den Fokus hat und es keine weiteren Controls gibt, funktioniert dein Code.

    Wenn du Allerdings das Event rihtig nutzen möchtest, wärend ein anderes Control den Fokus hat, musst du anders vorgehen. Entweder du behandelst von jedem Control das KeyPress-Event:

    ... Handles MyBase.KeyPress, Button1.KeyPress, ...

    Oder du benutzt einen IMessageFilter. Hier ein Beispiel:

    Public Class Form1
        Implements IMessageFilter

        Sub New()'Konstruktor
            InitializeComponent()

            Application.AddMessageFilter(Me) 'Handler hinzufügen
            AddHandler Me.FormClosed, Sub() Application.RemoveMessageFilter(Me) 'Beim Schließen der Form den handler wieder entfernen
        End Sub

        Function PreFilterMessage(ByRef m As Message) As Boolean Implements IMessageFilter.PreFilterMessage
            If m.Msg = &H100 Then 'KeyDown abfangen (WM_KEYDOWN)
                MsgBox("Taste")
                Return True 'Dies eMeldung nicht weiter reichen
            End If
            Return False 'Andere Meldungen ignorieren
        End Function
    End Class

    Zur KeyDown-Nachricht: http://msdn.microsoft.com/en-us/library/windows/desktop/ms646280.aspx

    Beachte aber, solange der Filter aktiv ist, kannst du auch nichts in TextBoxen etc. eingeben. Die Meldungen werden nur dann nicht weiter gereicht, wenn du aus PreFilterMessage True zurück gibst.


    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    Samstag, 14. Dezember 2013 16:57
  • Hallo.

    OK, danke. Das wird sicher helfen. Aber das müsste doch auch einfach gehen.

    Ich habe in meiner Form 5 Buttons. Sagen wir mal die Buttons "schreiben" von Button 1 bis von, wenn man sie anklickt, "Button <Nr.> aufgerufen". So, nun möchte ich aber nicht, dass die Buttons angeklickt werden müssen, sondern, dass man die Funktionen der Buttons mit <F2> bis <F6> aufrufen kann.

    Danke für weitere Tipps...

    Sonntag, 15. Dezember 2013 11:21
  • Hallo,
    das geht nicht wirklich einfacher. Windows Forms benutzt großteilig die originalen Windows Controls. Dort wird jedes Control als ein art eigenes Fenster betrachtet. Zuerst wird der Form bescheit gegeben (IMessageFilter), danach wird es dem Control gesagt, das aktuell den Fokus hat. Und dieses Control entscheidet dann ob es die Nachricht weiter reicht oder nicht. Das machen die Controls aber normalerweise nicht.

    In der If-Abfrage kannst du einfach den Tasten-Code prüfen:

        Function PreFilterMessage(ByRef m As Message) As Boolean Implements IMessageFilter.PreFilterMessage
            If m.Msg = &H100 Then 'KeyDown abfangen (WM_KEYDOWN)'
                Dim key As Keys = CType(m.WParam, Keys) 'Die Taste abfragen'
                Select Case key'Entscheiden was passieren soll'
                    Case Keys.F1
                        Button1.PerformClick() 'Click simulieren'
                        Return True 'Meldung nicht weiter reichen'
                        'usw. mit den anderen Button'
                End Select'Andere Meldungen werden naach dem if-Abfrage einfach weiter gereicht'
            End If
            Return False 'Andere Meldungen bzw. Tasten ignorieren'
        End Function

    Das empfinde ich nun nicht als sonderlich schwer oder schreibaufwendig, da es am Ende bestenfalls nur noch 3 Zeilen pro Taste sind.


    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.


    Sonntag, 15. Dezember 2013 11:45
  • Hallo.

    Nun habe ich es hin, vielen Dank....

    Sonntag, 15. Dezember 2013 12:00