我正在为应用程序开发一个插件。我需要实现一个低级的 keyhook 来捕获键。我曾尝试在与主应用程序 + 插件相同的线程上运行 keyhook,但它的性能是命中注定的。我无法与应用程序的原始开发人员进行查询。
因此,我实现了下面的代码来在后台工作人员上运行 keyhook。它工作可靠,但我非常清楚Application.DoEvents
我知道这很糟糕。编码:
Private WithEvents KeyHookBGW As New BackgroundWorker
Private WithEvents KeyHook As New WindowsHookLib.KeyboardHook
Private Sub KeyHookBGW_DoWork(sender As Object, e As DoWorkEventArgs) Handles KeyHookBGW.DoWork
Dim BgKeyhook As New KeyboardHook
BgKeyhook.InstallHook()
AddHandler BgKeyhook.KeyDown, AddressOf KeyHookBGW_KeyDown
Do While e.Cancel = False
Application.DoEvents()
Loop
End Sub
Private Sub KeyHookBGW_KeyDown(sender As Object, e As WindowsHookLib.KeyboardEventArgs)
KeyHookBGW.ReportProgress(0, e.KeyCode)
End Sub
Private Sub KeyHookBGW_ReportProg(sender As Object, e As ProgressChangedEventArgs) Handles KeyHookBGW.ProgressChanged
pm.Console.WriteLine("Key pressed: " & e.UserState)
End Sub
我确定我的架构很糟糕,但我有点坚持让它在开发环境中工作。我尝试在后台线程中使用计时器,但无法使其正常工作。我也在.net Framework 3.5(原始应用程序的框架)中开发,因此我认为这限制了我可以用线程做的事情。我研究了线程,我正在努力理解如何无限运行它们并与主线程进行通信。
因此,基本上,我需要在主应用程序 + 插件的生命周期内在单独的线程上运行 keyhook,并将任何 keydown 和 keyup 事件反馈到主线程中。有任何想法吗?