我安装了一个像这样的全局鼠标钩子函数:
mouseEventHook = ::SetwindowsHookEx( WH_MOUSE_LL,mouseEventHookFn,thisModule,0 );
钩子函数看起来像这样:
RESulT CALLBACK mouseEventHookFn( int code,WParaM wParam,LParaM lParam ) { if ( code == HC_ACTION ) { PMsllHOOKSTRUCT mi = (PMsllHOOKSTRUCT)lParam; // .. do interesting stuff .. } return ::CallNextHookEx( mouseEventHook,code,wParam,lParam ); }
现在,我的问题是,我无法控制'做有趣的东西'部分需要多长时间。 特别是,它可能需要比在windowsregistry中定义的LowLevelHooksTimeout更长的时间。 这意味着,至less在windows XP上,系统不再将鼠标事件传递给我的钩子函数。 我想避免这种情况,但同时我需要在目标GUI接收事件之前发生“做有趣的事情”部分。
我试图通过在单独的线程中执行“有趣的东西”工作来解决这个问题,以便上面的mouseEventHookFn可以将消息发布到工作线程,然后return 1; 立即(结束钩函数,但避免事件交给GUI)。 这个想法是,工作线程完成后,自己执行CallNextHookEx调用。
在Python脚本中以windows(不是admin)上的不同用户身份运行程序
Web应用程序可以访问和修改windowsregistry吗?
在特定的Dir C ++中通过扩展进行search
在windows 7上使用Hadoop 2.2运行JUnittesting
C#控制台应用程序在windows Server上无法正常工作(在win XP和win 7上工作正常)
但是,这会导致CallNextHookEx内部发生崩溃(事实上,崩溃发生在一个名为PhkNextValID的内部函数中,我认为从hook函数外部调用CallNextHookEx并不安全,这是真的吗?
如果是这样,其他人是否知道我可以在GUI接收事件之前运行代码(需要与应用程序的GUI线程交互), 并避免我的hook函数阻塞时间过长?
如何获取systeminfo语言环境 – Locale.getDefault()
如何解决“不表示正确可访问的目录”与UNCpath的例外?
为什么wchar_t被发明?
WkHTMLtopdf无法从PHP执行时parsing主机
在GDI +(或GDI)屏幕上绘制类似于检查
假设从钩子函数外部调用CallNextHookEx是不安全的,这是真的吗?
我相信这是事实。
由于您可以通过低级别的鼠标钩子获得有限的 *** 作次数,因此只要您的长时间运行 *** 作完成,您就可以将它们放到队列中重新发送到接收窗口。 如果你在另一个线程上长时间运行,你不会“锁定”UI,而只是“吃”或“推迟”用户 *** 作。 返回1以防止其他钩子发生。 使用布尔标志来表示是否收集事件(因为您的长时间运行的 *** 作还没有运行)或重新发布它们(因此不应该挂钩它们)。
系统中不可能存在(m)任何其他低级挂钩,但是您应该在您的情况下彻底测试此机制。 我只用它来阻止 *** 作(杀死鼠标右键),而不是推迟它们。
没有修复,你将不得不让你的代码更快。 这些钩子对用户界面的响应性可能是非常有害的,windows确保把一个行为不端的人放进地下室。 即使超时是可配置的,也不会被记录。 这将打破暂停超时的目的。
你为什么使用鼠标事件挂钩? 你一般是钩住鼠标还是只是为了一个特定的窗口? 如果是为特定的窗口,那么你需要 – 而不是使用钩子 – 实际上是目标窗口的子类。
这通常是一个2阶段的过程 – 钩子总是需要在DLL中,因为钩子需要在实际处理消息的进程(和线程)的上下文中执行。
所以你首先编写一个钩子dll,当发送一条消息时,调用HWND上的SetwindowLong来替换GWL_WINDOWPROC和你的新窗口proc。
在你的WindowProc中,只要你想处理消息就可以使用。
总结以上是内存溢出为你收集整理的我的代码如何运行直到我的代码完成运行,我怎么能保持一个事件被传递到GUI?全部内容,希望文章能够帮你解决我的代码如何运行直到我的代码完成运行,我怎么能保持一个事件被传递到GUI?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)