Das Problem ist doch sowieso nicht dieses, dass irgend ein Timer nicht gestartet ist. Da ich den auf True gesetzt habe, läuft der beim Start der Anwendung auch.
Das Problem ist gewesen, dass der Text bzw. sich die Textausgabe nach Hotkey-Betätigung 'unendlich' mal wiederholte. Mit Timer1.Stop kann das doch auch nichts werden - oder? Ich meine, zwar wird der Timer dann beendet und es gibt nur einmal eine Ausgabe des Textes, aber was dann? Die Hotkey-Funktion läuft dann ja nicht mehr, sondern steht erst dann wieder zur Verfügung, wenn die Anwendung beendet und neu gestartet wird.
Oder was konkret ist daran falsch?
Code:
Public Class Form1
Private Declare Function GetAsyncKeyState Lib "User32" (ByVal vKey As Integer) As Short
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
End Sub
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
Dim Hotkey1 As Boolean = GetAsyncKeyState(Keys.B)
Dim Hotkey2 As Boolean = GetAsyncKeyState(Keys.C)
If Hotkey1 = True Then
SendKeys.Send("tDie Taste B wurde gedrückt!{ENTER}tUnd es wurde gewartet")
Timer1.Stop()
ElseIf Hotkey2 = True Then
SendKeys.Send("tDie Taste C wurde gedrückt!{ENTER}tUnd es wurde gewartet")
Timer1.Stop()
End If
End Sub
Private Sub Form1(ByVal sender As System.Object, ByVal e As System.EventArgs)
Timer1.Start()
End Sub
End Class
Abgesehen davon habe ich das Problem über Nacht anderweitig gelöst. Habe nun zwei Funktionierende Versionen die das machen, was sie machen sollen. Könnte mir einer erklären, welche von beiden die bessere ist und was man allgemein noch anders/besser machen könnte?
Version 1:
Code:
Public Class Form1
Private Declare Function GetAsyncKeyState Lib "User32" (ByVal vKey As Integer) As Short
Private Const VK_B = &H42 ' Taste B
Private Const VK_C = &H43 ' Taste C
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
Dim Retval1 As Long
Dim Retval2 As Long
Dim Hotkey1 As Boolean = GetAsyncKeyState(VK_B)
Dim Hotkey2 As Boolean = GetAsyncKeyState(VK_C)
Retval1 = GetAsyncKeyState(VK_B)
Retval2 = GetAsyncKeyState(VK_C)
' Auswerten des Ergebnisses
If CBool(Retval1 And &H8000) Then
SendKeys.Send("Die Taste B wurde gedrückt!")
End If
If CBool(Retval2 And &H8000) Then
SendKeys.Send("Die Taste C wurde gedrückt!")
End If
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
End Sub
End Class
Version 2:
Code:
Option Strict Off
Option Explicit On
Friend Class Form1
Inherits System.Windows.Forms.Form
Private Declare Function GetAsyncKeyState Lib "user32.dll" (ByVal nVirtKey As Integer) As Short
Private Const KeyPressed As Short = -32767
Private Sub Form1_Load(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles MyBase.Load
End Sub
Private Sub Timer1_Tick(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles Timer1.Tick
Dim Hotkey1 As Integer
Dim HotKey2 As Integer
Hotkey1 = System.Windows.Forms.Keys.B
HotKey2 = System.Windows.Forms.Keys.C
If GetAsyncKeyState(Hotkey1) = KeyPressed Then
SendKeysEx("Die Taste B wurde gedrückt!")
End If
If GetAsyncKeyState(HotKey2) = KeyPressed Then
SendKeysEx("Die Taste C wurde gedrückt!")
End If
End Sub
End Class
Noch eine ganz wichtige Frage:
Kann man sämtliche Hotkey-Funktionen 'deaktivieren' lassen über einen anderen Hotkey (z.B. der Taste P), so dass man gesetzte Hotkey-Tasten ohne einer Hotkey-Funktion nutzen kann - und sämtliche Hotkeys bei einer weiteren festgelegten Taste (z.B. Escape oder Return) wieder aktivieren?