在不同的线程中安装低级鼠标钩子



我需要在我的WPF应用程序中安装一个WH_KEYBOARD_LL钩子,这本身并不是一个大问题。然而,我需要将它安装在一个线程中,而不是我的主应用程序线程,因为否则,当UI线程繁忙时,光标将冻结。我读过这篇文章和这个问题,但它还没有完全工作。问题中的评论建议我在创建钩子的线程中启动一个应用程序,但随后我得到一个异常,说我不能在同一个AppDomain中启动2个应用程序。是否有任何解决方案,或者是否有另一种更简单的方法将钩子安装在另一个线程中?

您可以使用以下代码创建一个带有WPF调度程序的新线程:

public class DispatcherBuilder : IBuilder<Dispatcher>
{
    public Dispatcher Build()
    {
        Dispatcher dispatcher = null;
        var manualResetEvent = new ManualResetEvent(false);
        var thread = new Thread(() =>
            {
                dispatcher = Dispatcher.CurrentDispatcher;
                var synchronizationContext = new DispatcherSynchronizationContext(dispatcher);
                SynchronizationContext.SetSynchronizationContext(synchronizationContext);
                manualResetEvent.Set();
                Dispatcher.Run();
            });
        thread.Start();
        manualResetEvent.WaitOne();
        manualResetEvent.Dispose();
        return dispatcher;
    }
}

Build方法创建一个带有WPF Dispatcher和正确同步上下文的新线程。这个线程一直运行,直到关闭调度程序。然后你可以使用例如Dispatcher.BeginInvoke来创建你的钩子

最新更新