1

我正在为应用程序开发一个插件。我需要实现一个低级的 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 事件反馈到主线程中。有任何想法吗?

4

0 回答 0