Keypress Problem

Hallo,
ich habe ein schon seit gestern mit folgendem Problem zu kämpfen: Ich bekomme mein Programm zwar so gecodet, dass es den Prozess (hier als Beispiel Taskmanager) per ButtonKlick beendet. Ich habe bereits vieles versucht, aber ich schaffe es nicht, den Private Sub Button2_Click mit einem KeyPress oder KeyDown mit der Taste Escape zu ersetzen. Könnte mir evtl jemand helfen? Hier der Code:
Code:
Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Me.Close()
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        For Each Process In System.Diagnostics.Process.GetProcessesByName("taskmgr")
            Process.Kill()
        Next
    End Sub
End Class
 
Möglichkeit 1:
Du setzt die CancelButton-Eigenschaft der Form auf Button1 - damit wird die PerformClick-Methode des Buttons ausgeführt, wenn die Escape-Taste gedrückt wird.
Code:
Me.CancelButton = Me.Button1 ' kannst du auch im Designer einstellen
Möglichkeit 2:
Du verwendest das KeyDown/KeyUp-Event und setzt die Eigenschaft KeyPreview auf true:
Code:
Me.KeyPreview = True

Private Sub Form1_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyUp
    If e.KeyCode = Keys.Escape Then Me.Close()
End Sub
 
EDIT: Funktioniert mittlerweile. Habe <KeyPreview> einfach im Designer auf True gesetzt. Jedoch habe ich folgendes Problem: Das Programm beendet den Prozess "taskmgr", solange mein geschriebenes Programm im Vordergrund ist. Da mein Programm für ein Spiel gedacht ist, geht das schlecht, da das Spiel ja dann im Vordergrund ist und im Falle eines Freezes dann per Taste beendet werden kann. Ich habe bereits eine Lösung gefunden, VS zeigt keine Fehler an, leider erscheint beim Debuggen dann die Meldung "Win32exception wurde nicht behandelt - Fehler beim Erstellen des Fensterhandles." Eine Lösung finde ich auch per Google nicht. Hat jemand eine Idee? Hier nochmal der gesamte Code:
Code:
Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Me.Close()
    End Sub
    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
        If m.Msg = Keys.F9 Then
            Me.Show()
        End If
    End Sub
    Private Sub Form1_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyUp
        If e.KeyCode = Keys.F9 Then
            For Each Process In System.Diagnostics.Process.GetProcessesByName("taskmgr")
                Process.Kill()
            Next
        End If
    End Sub
End Class
 
Zuletzt bearbeitet:
Kann das jetzt nicht unbedingt nachvollziehen, aber du solltest auch die WndProc-Methode der überschriebenen Klasse aufrufen, falls du nicht alle Nachrichten behandeln willst. Außerdem überprüfst du nicht, ob es sich bei der empfangenen Nachricht wirklich um einen Tastendruck handelt, sondern du überprüfst jede Nachricht unabhängig vom Typ ob sie zufällig den Wert Cint(Keys.F9) hat.
Also besser irgendwie sowas:
Code:
Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
    If (m ist eine Tastendruck-Nachricht) AND (m.Msg = Keys.F9) Then
        Me.Show()
    Else
        MyBase.WndProc(m)
    End If
End Sub
Außerdem sehe ich noch nicht warum du die WndProc der Form überhaupt überschreiben willst. Wenn die Form nicht den Fokus hat wird der F9-Tastendruck auch niemals bei ihr ankommen. Ich denke du müsstest da einen globalen Hook verwenden um auf alleTastendrücke reagieren zu können.
 
Hallo Shakie,
tut mir leid, mein Fehler. Hatte da irgendetwas durcheinandergebracht. Wollte ja zuerst soweit kommen, dass wenn das Prog minimiert ist, er sich auf Tastendruck wiederherstellt. Funktioniert aber auch nicht, da das Programm eben wieder nciht den Befehl 'mitkriegt' weil es nicht aktiv ist. So sieht also mein Code aus
Code:
Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Me.Close()
    End Sub
    Private Sub Form1_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyUp
        If e.KeyCode = Keys.F9 Then
            'Programm muss auch im Hintergrund auf den Tastendruck reagieren.
            For Each Process In System.Diagnostics.Process.GetProcessesByName("taskmgr")
                Process.Kill()
            Next
        End If
    End Sub
End Class
Hier fehlt jetzt noch die bestimmte Zeile, dass er die Befehle abruft, auch wenn das Prog nicht im Vordergrund ist.
Die bräuchte eigentlich nur, denn das Programm funktioniert so ja spitze, leider nur im Vordergrund.
 
Danke für die Lösung. Habe jetzt bereits schon eine andere Lösung, die funktioneirt eig. auch. Wenn ich das ganze für den Prozess taskmgr teste, dann funktioniert alles prima. Probiere ich das Prog bei einem Spiel spuckt er mir beim Drücken der F9 Taste einen .Net Framework Fehler aus, "Unbehandelte Ausnahme".
Hier der Code:
Code:
Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Me.Close()
    End Sub
    Private Declare Function RegisterHotKey Lib "user32" (ByVal hWnd As IntPtr, ByVal id As Integer, ByVal fsModifier As Integer, ByVal vk As Integer) As Integer
    Private Declare Sub UnregisterHotKey Lib "user32" (ByVal hWnd As IntPtr, ByVal id As Integer)
    Private Const Key_NONE As Integer = &H0
    Private Const WM_HOTKEY As Integer = &H312

    Protected Overrides Sub WndProc(ByRef m As Message)
        If m.Msg = WM_HOTKEY Then
            Select Case m.WParam
                Case 1
                    For Each Process In System.Diagnostics.Process.GetProcessesByName("Warrock")
                        Process.Kill()
                    Next
            End Select
        End If
        MyBase.WndProc(m)
    End Sub

    Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        'die F9 Taste wieder freigeben
        UnregisterHotKey(Me.Handle, 1)
    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'die F9 Taste abfangen
        RegisterHotKey(Me.Handle, 1, Key_NONE, Keys.F9)
    End Sub
End Class
 
Was meinst du genau? Ganz einfach: Auch wenn das Prog im Hintergrund läuft soll es den Tastendruck ( in meinem Fall F9 ) die Anweisung (Prozess beenden) ausführen.

MfG
 
Zurück