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

时间:2014-08-26 09:56:59

标签: c# .net wpf multithreading winapi

我需要在我的WPF应用程序中安装WH_KEYBOARD_LL挂钩,这本身并不是一个大问题。但是我需要将它安装在我的主应用程序线程以外的线程中,否则当UI线程忙时光标将冻结。我已经阅读了this文章和this SO问题,但它尚未完成。问题中的注释建议我在我创建钩子的线程中启动一个Application,但后来我得到并且异常说我不能在同一个AppDomain中启动2个应用程序。是否有任何解决方案或是否有另一种更简单的方法在另一个线程中安装钩子?

1 个答案:

答案 0 :(得分:1)

您可以使用以下代码使用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创建你的钩子。