Hallo
Das muss nicht so geschehen. Mir fällt nur nichts anders ein wie ich das Problem lösen soll.
Ich möchte nur einen Keyboardrepeat verwirklichen.
Drücke ich eine Taste auf der Fernbedienung bekomme ich einen int grösser 0. Lasse ich die Taste wieder los dann bekomme ich eine 0 über die sub RCB.
Also habe ich mir gedacht wenn die 0 kommt schalte ich den Timer ab und wenn größer dann schalte ich den Timer ein.
Das habe ich vorher simuliert indem ich das ein/ausschalten des Timers auf 2 Buttons gelegt habe.
Das funzt auch.
Public Class Form1
Private KeepAliveDelegate As Threading.TimerCallback
Private KeepAliveTimer As System.Threading.Timer
Private Declare Sub keybd_event Lib "user32.dll" (ByVal bVk As Byte, ByVal _
bScan As Byte, ByVal dwFlags As Int32, ByVal dwExtraInfo As Int32)
Private Const VK_CONTROL As Int32 = &H11
Private Const KEYEVENTF_KEYUP As Int32 = &H2
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles MyBase.Load
KeepAliveDelegate = AddressOf KeepAliveTimerHandler
End Sub
Private Sub KeepAliveTimerHandler(ByVal state As Object)
keybd_event(38, 0, 0, 0)
keybd_event(38, 0, KEYEVENTF_KEYUP, 0)
End Sub
Private Sub Button1_MouseDown(ByVal sender As Object, ByVal e As _
System.Windows.Forms.MouseEventArgs) Handles Button1.MouseDown
KeepAliveTimer = New System.Threading.Timer(KeepAliveDelegate, Nothing, _
0, 50)
End Sub
Private Sub Button2_MouseUp(ByVal sender As Object, ByVal e As _
System.Windows.Forms.MouseEventArgs) Handles Button2.MouseUp
KeepAliveTimer.Change(0, System.Threading.Timeout.Infinite)
End Sub
End Class Wenn ich jetzt aber den Timer innerhalb von der Sub RCB einschalten will dann humpelt es eben und der Repeat wird nicht gleichmässig ausgelößt.
Imports System.Threading
Imports HIDLibrary.HidDevice
Imports HIDLibrary
Public Class Form1
Private KeepAliveDelegate As Threading.TimerCallback
Private KeepAliveTimer As System.Threading.Timer
Private Declare Sub keybd_event Lib "user32.dll" (ByVal bVk As Byte, ByVal _
bScan As Byte, ByVal dwFlags As Int32, ByVal dwExtraInfo As Int32)
Private Const VK_CONTROL As Int32 = &H11
Private Const KEYEVENTF_KEYUP As Int32 = &H2
Friend WithEvents _HidDevice As HIDLibrary.HidDevice
Private t As Thread
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles MyBase.Load
KeepAliveDelegate = AddressOf KeepAliveTimerHandler
Dim HidDeviceList As HIDLibrary.HidDevice()
HidDeviceList = HidDevices.Enumerate("&H54C", "&H306")
If HidDeviceList.Length > 0 Then
_HidDevice = HidDeviceList(0)
_HidDevice.MonitorDeviceEvents = True
t = New Thread(AddressOf Me.RunBackgrounder)
t.Start()
End If
End Sub
Private Sub RunBackgrounder()
While 1
_HidDevice.Read(AddressOf rcb)
End While
End Sub
Private Sub KeepAliveTimerHandler(ByVal state As Object)
keybd_event(38, 0, 0, 0)
keybd_event(38, 0, KEYEVENTF_KEYUP, 0)
End Sub
Private Sub Button1_MouseDown(ByVal sender As Object, ByVal e As _
System.Windows.Forms.MouseEventArgs) Handles Button1.MouseDown
KeepAliveTimer = New System.Threading.Timer(KeepAliveDelegate, Nothing, _
0, 50)
End Sub
Private Sub Button2_MouseUp(ByVal sender As Object, ByVal e As _
System.Windows.Forms.MouseEventArgs) Handles Button2.MouseUp
KeepAliveTimer.Change(0, System.Threading.Timeout.Infinite)
End Sub
Private Sub rcb(ByVal data As HIDLibrary.HidDeviceData)
If CInt(data.Data(1)) > 0 Then
KeepAliveTimer = New System.Threading.Timer(KeepAliveDelegate, _
Nothing, 0, 50)
Else
KeepAliveTimer.Change(0, System.Threading.Timeout.Infinite)
End If
End Sub
End Class |