LowLevelMouseProc在后台线程
问题描述:
我想在后台线程上设置鼠标钩。LowLevelMouseProc在后台线程
delegate IntPtr LowLevelMouseProc(int nCode, IntPtr wParam, IntPtr lParam);
LowLevelMouseProc _proc = HookCallback;
SetWindowsHookEx(PInvoke.WH_MOUSE_LL, _proc, IntPtr.Zero, 0);
和
IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam){/**/}
如果我把这个主窗口线程一切正常,直到窗口有做这会导致鼠标停止响应这项工作的持续时间更复杂的工作(更新多个孩子例如在面板中)。
如果我开始一个新的线程,并从那里设置钩子,问题是线程简单地退出后设置钩子和回调函数永远不会被调用。
有没有办法让线程活着? 或者,如果存在另一种方法来连接鼠标而不冒着不响应的行为风险?
我不期而遇注意到,当工作线程执行
GetMessage(out msg, new IntPtr(0), 0, 0);
没有消息不断收到,但线程被保持存活所需的目的。 另外我需要一个优雅的方式来关闭线程,但GetMessage永远不会返回。
我不完全理解所有这些信息,我只是希望能够连接鼠标并防止冻结。
任何帮助appriciated。
答
在您的钩子回调方法中,只需启动一个新线程即可。事情是这样的:
IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
{
ThreadPool.QueueUserWorkItem(obj =>
{
// do whatever ...
});
}
不要忘记,如果你的处理需要访问您的控件的形式在你的主线程调用。
编辑:
如果你做你的主要形式线程的东西是凝固起来的UI,你应该考虑这样做的动作在后台线程而非主线程。当您需要通过处理更新控件时,则可以调用。
this.WhateverControl.Invoke(/* ... /*);
答
低电平鼠标钩子需要在其中称为SetWindowsHookEx函数的线程中运行的消息循环。这就是为什么它不能在简单的后台线程中工作,并在UI线程中工作。如果你想在后台线程中使用这个钩子,在SetWindowsHookEx之后调用Application.Run方法。线程保留在此循环中并处理低级别的挂钩消息。