tutorials.de Buch-Aktion 05/2012
Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
NEIN
ANTWORTEN
15
ZUGRIFFE
884
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Scriptwidgets Scriptwidgets ist offline Mitglied Bronze
    Registriert seit
    May 2008
    Beiträge
    49
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    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
     

  2. #2
    Avatar von Shakie
    Shakie Shakie ist offline Mitglied Diamant
    Registriert seit
    May 2004
    Ort
    Europa
    Beiträge
    2.048
    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 vbnet:
    1
    
    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 vbnet:
    1
    2
    3
    4
    5
    
    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
     

  3. #3
    Scriptwidgets Scriptwidgets ist offline Mitglied Bronze
    Registriert seit
    May 2008
    Beiträge
    49
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
    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
    Geändert von Scriptwidgets (09.06.10 um 15:59 Uhr)
     

  4. #4
    Avatar von Shakie
    Shakie Shakie ist offline Mitglied Diamant
    Registriert seit
    May 2004
    Ort
    Europa
    Beiträge
    2.048
    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 vbnet:
    1
    2
    3
    4
    5
    6
    7
    
    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.
     

  5. #5
    Scriptwidgets Scriptwidgets ist offline Mitglied Bronze
    Registriert seit
    May 2008
    Beiträge
    49
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    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.
     

  6. #6
    Cromon Cromon ist offline Mitglied Brillant
    Registriert seit
    Apr 2008
    Beiträge
    819
    Wenn du auch Nachrichten haben willst, die nicht für dein Programm gedacht sind (da es ja nicht den Eingabefokus hat) musst du entsprechend einen Windows-Hook setzen.
    http://www.codeproject.com/kb/dll/keyboardhook.aspx
     

  7. #7
    Scriptwidgets Scriptwidgets ist offline Mitglied Bronze
    Registriert seit
    May 2008
    Beiträge
    49
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    
    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
     

  8. #8
    Cromon Cromon ist offline Mitglied Brillant
    Registriert seit
    Apr 2008
    Beiträge
    819
    Welche Exception wird denn geworfen?
     

  9. #9
    Scriptwidgets Scriptwidgets ist offline Mitglied Bronze
    Registriert seit
    May 2008
    Beiträge
    49
    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
     

  10. #10
    Cromon Cromon ist offline Mitglied Brillant
    Registriert seit
    Apr 2008
    Beiträge
    819
    Zitat Zitat von Scriptwidgets Beitrag anzeigen
    Probiere ich das Prog bei einem Spiel spuckt er mir beim Drücken der F9 Taste einen .Net Framework Fehler aus, "Unbehandelte Ausnahme".
    Welche Exception wird geworfen?
     

  11. #11
    Scriptwidgets Scriptwidgets ist offline Mitglied Bronze
    Registriert seit
    May 2008
    Beiträge
    49
    Das hier spuckt er aus:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    
    Informationen über das Aufrufen von JIT-Debuggen
    anstelle dieses Dialogfelds finden Sie am Ende dieser Meldung.
     
    ************** Ausnahmetext **************
    System.ComponentModel.Win32Exception (0x80004005): Zugriff verweigert
       bei System.Diagnostics.ProcessManager.OpenProcess(Int32 processId, Int32 access, Boolean throwIfExited)
       bei System.Diagnostics.Process.GetProcessHandle(Int32 access, Boolean throwIfExited)
       bei System.Diagnostics.Process.Kill()
       bei WindowsApplication1.Form1.WndProc(Message& m)
       bei System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
       bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
       bei System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
     
     
    ************** Geladene Assemblys **************
    mscorlib
        Assembly-Version: 4.0.0.0.
        Win32-Version: 4.0.30319.1 (RTMRel.030319-0100).
        CodeBase: file:///C:/Windows/Microsoft.NET/Framework/v4.0.30319/mscorlib.dll.
    ----------------------------------------
    XIII Process Killer
        Assembly-Version: 1.0.0.0.
        Win32-Version: 1.0.0.0.
        CodeBase: file:///C:/Users/Rahul/Desktop/XIII%20Process%20Killer.exe.
    ----------------------------------------
    Microsoft.VisualBasic
        Assembly-Version: 10.0.0.0.
        Win32-Version: 10.0.30319.1 built by: RTMRel.
        CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/Microsoft.VisualBasic/v4.0_10.0.0.0__b03f5f7f11d50a3a/Microsoft.VisualBasic.dll.
    ----------------------------------------
    System
        Assembly-Version: 4.0.0.0.
        Win32-Version: 4.0.30319.1 built by: RTMRel.
        CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System/v4.0_4.0.0.0__b77a5c561934e089/System.dll.
    ----------------------------------------
    System.Core
        Assembly-Version: 4.0.0.0.
        Win32-Version: 4.0.30319.1 built by: RTMRel.
        CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Core/v4.0_4.0.0.0__b77a5c561934e089/System.Core.dll.
    ----------------------------------------
    System.Windows.Forms
        Assembly-Version: 4.0.0.0.
        Win32-Version: 4.0.30319.1 built by: RTMRel.
        CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms/v4.0_4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll.
    ----------------------------------------
    System.Drawing
        Assembly-Version: 4.0.0.0.
        Win32-Version: 4.0.30319.1 built by: RTMRel.
        CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Drawing/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll.
    ----------------------------------------
    System.Configuration
        Assembly-Version: 4.0.0.0.
        Win32-Version: 4.0.30319.1 (RTMRel.030319-0100).
        CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Configuration/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll.
    ----------------------------------------
    System.Xml
        Assembly-Version: 4.0.0.0.
        Win32-Version: 4.0.30319.1 built by: RTMRel.
        CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll.
    ----------------------------------------
    System.Runtime.Remoting
        Assembly-Version: 4.0.0.0.
        Win32-Version: 4.0.30319.1 (RTMRel.030319-0100).
        CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Runtime.Remoting/v4.0_4.0.0.0__b77a5c561934e089/System.Runtime.Remoting.dll.
    ----------------------------------------
    System.Windows.Forms.resources
        Assembly-Version: 4.0.0.0.
        Win32-Version: 4.0.30319.1 built by: RTMRel.
        CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms.resources/v4.0_4.0.0.0_de_b77a5c561934e089/System.Windows.Forms.resources.dll.
    ----------------------------------------
    mscorlib.resources
        Assembly-Version: 4.0.0.0.
        Win32-Version: 4.0.30319.1 (RTMRel.030319-0100).
        CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/mscorlib.resources/v4.0_4.0.0.0_de_b77a5c561934e089/mscorlib.resources.dll.
    ----------------------------------------
     
    ************** JIT-Debuggen **************
    Um das JIT-Debuggen (Just-In-Time) zu aktivieren, muss in der
    Konfigurationsdatei der Anwendung oder des Computers
    (machine.config) der jitDebugging-Wert im Abschnitt system.windows.forms festgelegt werden.
    Die Anwendung muss mit aktiviertem Debuggen kompiliert werden.
     
    Zum Beispiel:
     
    <configuration>
        <system.windows.forms jitDebugging="true" />
    </configuration>
     
    Wenn das JIT-Debuggen aktiviert ist, werden alle nicht behandelten
    Ausnahmen an den JIT-Debugger gesendet, der auf dem
    Computer registriert ist, und nicht in diesem Dialogfeld behandelt.
     

  12. #12
    Cromon Cromon ist offline Mitglied Brillant
    Registriert seit
    Apr 2008
    Beiträge
    819
    Es steht doch hier ganz klar, was das Problem ist
    System.ComponentModel.Win32Exception (0x80004005): Zugriff verweigert

    Versuch mal ob es geht, wenn du den Debugmodus betrittst mit deinem Prozess. Also vorher
    Code :
    1
    
    System.Diagnostics.Process.EnterDebugMode();

    aufrufen.
     

  13. #13
    Scriptwidgets Scriptwidgets ist offline Mitglied Bronze
    Registriert seit
    May 2008
    Beiträge
    49
    Wo muss ich den Code eingeben?
     

  14. #14
    Cromon Cromon ist offline Mitglied Brillant
    Registriert seit
    Apr 2008
    Beiträge
    819
    Dein Prozess muss bevor er auf andere geschützte Prozesse zugreiffen will das SE_DEBUG-Privileg bekommen. Das geschieht über EnterDebugMode. Wo das dann in deinem Code genau ist musst du schon selbst herausfinden
     

  15. #15
    Scriptwidgets Scriptwidgets ist offline Mitglied Bronze
    Registriert seit
    May 2008
    Beiträge
    49
    Funktioniert leider immernoch nicht. Hier der Code, wie er derziet aussieht.
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    
    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)
            System.Diagnostics.Process.EnterDebugMode()
            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
     

Ähnliche Themen

  1. (KeyPress) Frage
    Von The_Jan im Forum Visual Basic 6.0
    Antworten: 3
    Letzter Beitrag: 20.09.06, 23:43
  2. KeyDown/KeyPress-PROBLEM!
    Von Mailyn im Forum Visual Basic 6.0
    Antworten: 1
    Letzter Beitrag: 29.12.05, 20:10
  3. KeyPress auf gesamte Form
    Von Speedkill im Forum .NET Archiv
    Antworten: 1
    Letzter Beitrag: 02.08.05, 10:51
  4. KeyPress Event
    Von LordDeath im Forum .NET Archiv
    Antworten: 8
    Letzter Beitrag: 20.04.05, 19:55
  5. VBA / KeyPress / vbKeyEscape
    Von LunaSun im Forum Visual Basic 6.0
    Antworten: 2
    Letzter Beitrag: 19.08.03, 11:26