我需要在我的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
来创建你的钩子