gpt4 book ai didi

c# - 后台线程中的 LowLevelMouseProc

转载 作者:太空宇宙 更新时间:2023-11-03 14:26:21 26 4
gpt4 key购买 nike

我正在尝试在后台线程上设置鼠标 Hook 。

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){/**/}

如果我把它放在主窗口线程上,一切正常,直到窗口必须做更复杂的工作,这会导致鼠标在该工作期间停止响应(例如,更新面板中的多个子项)。

如果我启动一个新线程并从那里设置 Hook ,问题是线程在设置 Hook 后简单地退出并且永远不会调用回调函数。

有没有办法为此目的使线程保持事件状态?或者是否存在另一种连接鼠标而不冒无响应行为风险的方法?

我无意中注意到,当工作线程执行时

GetMessage(out msg, new IntPtr(0), 0, 0);

没有收到任何消息,但为了所需的目的线程正在保持事件状态。此外,我需要一种优雅的方式来关闭线程,但 GetMessage 永远不会返回。

我不太理解所有这些消息,我只是想连接鼠标并防止其卡住。

欢迎提供任何帮助。

最佳答案

低级鼠标 Hook 需要在调用 SetWindowsHookEx 的线程中运行消息循环。这就是为什么它在简单的后台线程中不起作用,而在 UI 线程中起作用的原因。如果要在后台线程中使用此 Hook ,请在 SetWindowsHookEx 之后调用 Application.Run 方法。线程保留在这个循环中并处理低级 Hook 消息。

关于c# - 后台线程中的 LowLevelMouseProc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3847842/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com