SetWinEventHook 事件钩子(有些windows事件并没有消息对应,譬如弹出菜单,切换窗口,获得焦点,滚动条滚动等)good

相信消息钩子大家听的比较多,消息钩子能够在应用程序处理系统消息之前将其截获,提前处理并可以决定是否继续将消息往下传送,有些windows事件并没有消息对应,譬如弹出菜单,切换窗口,获得焦点,滚动条滚动等等,要截获这些事件可以使用SetWinEventHook,它的原型如下:

HWINEVENTHOOK WINAPI SetWinEventHook(
  __in  UINT eventMin,
  __in  UINT eventMax,
  __in  HMODULE hmodWinEventProc,
  __in  WINEVENTPROC lpfnWinEventProc,
  __in  DWORD idProcess,
  __in  DWORD idThread,
  __in  UINT dwflags
);

详细说明见MSDN:http://msdn.microsoft.com/en-us/library/dd373640(VS.85).aspx,其中第四个参数类似消息钩子一样是一个回调函数,说明见:http://msdn.microsoft.com/en-us/library/dd373885(VS.85).aspx

SetWinEventHook的第1,2个参数可以标识一个范围,表示截获哪个范围类的事件,因为实际上在win32里面这些事件的ID都是直接用defined直接从小到大定义的,有两个宏分别表示最小的事件ID和最大的事件ID(EVENT_MIN和EVENT_MAX),如果你分别传这两个参数给eventMin和eventMax则可以截获所有的事件,具体可以截获的事件可以去MSDN查询:http://msdn.microsoft.com/en-us/library/dd318066(VS.85).aspx

要停止HOOK,请调用UnhookWinEvent,原型为:

BOOL WINAPI UnhookWinEvent(
  __in  HWINEVENTHOOK hWinEventHook
);

观察回调函数的参数,可以使用API AccessibleObjectFromEvent来使用微软的MS Active Accessibility 接口技术,获得IAccessible 接口,可以使用一些比较有趣的功能,通过程序来访问UI元素等等,不过我也是刚刚了解到这个Accessibility 接口技术,有空再看看具体情况。^_^

事件钩子也有进程内和进程外事件钩子,相比消息钩子不同的是你收到一个事件发生的消息后,并不能控制拦截该事件不再传递事件。

代码说明:

[cpp] view plain copy

  1. ……
  2. void CSetWinEventHookDlg::OnOK()
  3. {
  4. if (NULL == m_hHook)
  5. {
  6. m_hHook = ::SetWinEventHook(
  7. EVENT_MIN,
  8. EVENT_MAX,
  9. NULL,
  10. WinEventsProc, 0, 0,
  11. WINEVENT_OUTOFCONTEXT);
  12. }
  13. }
  14. void CSetWinEventHookDlg::OnCancel()
  15. {
  16. if (m_hHook)
  17. {
  18. ::UnhookWinEvent(m_hHook);
  19. m_hHook = NULL;
  20. }
  21. }
  22. ……
  23. VOID CALLBACK WinEventsProc(HWINEVENTHOOK hWinEventHook, DWORD dwEvent, HWND hwnd, LONG idObject, LONG idChild, DWORD dwEventThread, DWORD dwmsEventTime )
  24. {
  25. switch(dwEvent)
  26. {
  27. case EVENT_SYSTEM_SWITCHSTART:
  28. CSetWinEventHookDlg::ChangUI(_T("Alt+Tab Start"));
  29. break;
  30. case EVENT_SYSTEM_SWITCHEND:
  31. CSetWinEventHookDlg::ChangUI(_T("Alt+Tab End"));
  32. break;
  33. case EVENT_SYSTEM_MENUPOPUPSTART:
  34. CSetWinEventHookDlg::ChangUI(_T("PopMenu Start"));
  35. break;
  36. case EVENT_SYSTEM_MENUPOPUPEND:
  37. CSetWinEventHookDlg::ChangUI(_T("PopMenu End"));
  38. break;
  39. }
  40. }

http://blog.csdn.net/magictong/article/details/4753122

时间: 2024-10-07 05:22:08

SetWinEventHook 事件钩子(有些windows事件并没有消息对应,譬如弹出菜单,切换窗口,获得焦点,滚动条滚动等)good的相关文章

Android学习----------长按列表项弹出菜单,给菜单项添加事件,获取上下文

这里是先显示一个listview,长按listview的一个列表项,弹出一个菜单来,菜单有两个条目, "更新该条"和"删除该条",并且这两条都有监听事件,整体就像微信好友对话操作一样. 其中菜单项有一个获取上下文的操作:AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo(); 这句也是用于列表项的. 具体代码如下: protected void onCreate(Bundle

关于windows 下每次打开IE 8都弹出欢迎使用Internet Explorer 8 弹窗的关闭方法

今天笔者在安装完windows 操作系统后,发现了一个问题,即每次打开IE 8浏览器,都会弹出一个欢迎界面: 弹窗标题为:设置windows Internet Explorer,具体内容如下图所示: 经过研究发现,最终还是找到关闭弹窗信息的方法,具体步骤如下: 1.运行:gpedit.msc进入组策略管理 2.找到,计算机配置--管理模板--Windows 组件--Internet Explorer,下的[阻止执行首次运行自定义设置] 3.右键编辑,将此项配置成 已启动,选择所需的选项处设置为:

windows svchost.exe 引起的出现的莫名其秒的窗口失去焦点

我不知道你们遇到没,反正我是遇到了,现在我就把解决方法给你们,当然都是从网上整理下来的 这个失去焦点可以分为两种,一种是病毒,一种是系统自带的问题 首先你得知道自己的窗口被什么给挤掉了焦点 先看看这篇文章: 电脑无故失去焦点,罪魁祸首是谁?终极解决办法 里面有两个工具组合使用可以查看你的窗口被什么进程给顶掉了焦点,具体怎么使用里面有说明我就不赘述了. 我这里是一开始查询到到底是什么进程不停的抢我焦点. 开始看着着标题名字很耐人寻味,不是有人在耍我吧~,结果我就放入了ViewWizard (这个是

应用SetWinEventHook截获Windows事件

用SetWindowsHookEx可以截获Windows中的消息,然而对于更高级一点的Windows事件(如:弹出菜单事件.ATL+TAB切换事件等等),可以用SetWinEventHook来截获. SetWinEventHook创建的钩子也分为进程内和进程外两种,进程内钩子效率高但必须以DLL形式存在,因为其须映射到别的进程中.在这个Demo中我采用进程外钩子来截获所有事件. 钩子例程如下所示: VOID CALLBACK WinEventsProc( HWINEVENTHOOK hWinEv

针对jquery绑定click事件执行两次,layer弹出框,以及img的map属性应用。

前不久使用jQuery与layer实现一个弹出框,发现在绑定弹出框事件时,事件执行了两次,准确的说是方法同时注册了两次,不分先后执行了两遍,导致弹出框弹出两次.请教同事后,发现原因有可能是jQuery的js与layer的js冲突(具体原因还需要深入了解),通过网络和请教同事,得到了三种处理方法. 方法一:不采用jQuery进行事件的绑定,直接在标签中添加onclick事件. 方法二:采用这种方式$("#item_add_button")[0].onclick = function(){

Android 另类方法监听软键盘的弹出收起事件

http://www.cnblogs.com/csonezp/p/5065624.html 最近做的项目碰到个问题,a界面是fragment+recyclerview,b界面带个edittext,并且会自动获得焦点弹出软键盘.由a界面进入b界面,再结束b界面返回a界面,就会在a界面上留下一片和软键盘大小相同的灰色区域,具体原因搞了很久也不清楚.但是问题总是要解决的,我在a的fragment上折腾了半天,始终没什么用.然后就想着在b界面折腾折腾,关闭activity的时候先收起挼键盘,软键盘收起完

第二十七课:滚轮事件,mouseenter与mouseleave事件的修复

滚轮事件 jQuery核心库没有对mousewheel事件的差异性进行处理,但作为一个常用的事件,本文讲解一下. mousewheel事件只有火狐浏览器不支持.mousewheel用于取得滚动距离的属性名为event.wheelDelta,往上滚一圈是120,往下滚一圈是-120.在IE6-8下,window无法绑定mousewheel事件,Opera,Safari,Chrome可以. 火狐下使用DOMMouseScroll来代替mousewheel事件.用于取得滚动距离的属性名为event.d

js的事件冒泡和点击其他区域隐藏弹出层

一.前言 在编写页面的时候,我们经常使用到弹出层.对于弹出层,原本的意义就是增加与用户的交互,提升用户的好感度.如果弹出层都没有较好的体验,那何谈通过交互来提升好感... 首先提出几个弹出层的注意点: 弹出层的界面需要统一,不一致的弹出层并不能增加美感,相反还会显得页面布局更加杂乱无章: 弹出层的设计一定要好看,按钮要符合项目的主色调: 弹出层的宽度固定屏幕占比,设置max-width,高度根据内容自适应: 点击其他区域隐藏弹出层... 二.正文 今天,主要说说点击其他区域隐藏弹出层.笔者被这个

vue中的长按事件和点击事件冲突

<div> <img src="/static/images/poi-marker-default.png" @touchstart.prevent="touchin()" @touchend.prevent="clickhandle()" > </div> data() { return { Loop:0 } }, methods: { touchin(index){ // 长按事件,按住后等待指定事件触发