SetWinEventHook 事件钩子
2009-11-01 01:26
1001 查看
相信消息钩子大家听的比较多,消息钩子能够在应用程序处理系统消息之前将其截获,提前处理并可以决定是否继续将消息往下传送,有些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 接口技术,有空再看看具体情况。^_^
事件钩子也有进程内和进程外事件钩子,相比消息钩子不同的是你收到一个事件发生的消息后,并不能控制拦截该事件不再传递事件。
代码说明:
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 接口技术,有空再看看具体情况。^_^
事件钩子也有进程内和进程外事件钩子,相比消息钩子不同的是你收到一个事件发生的消息后,并不能控制拦截该事件不再传递事件。
代码说明:
…… void CSetWinEventHookDlg::OnOK() { if (NULL == m_hHook) { m_hHook = ::SetWinEventHook( EVENT_MIN, EVENT_MAX, NULL, WinEventsProc, 0, 0, WINEVENT_OUTOFCONTEXT); } } void CSetWinEventHookDlg::OnCancel() { if (m_hHook) { ::UnhookWinEvent(m_hHook); m_hHook = NULL; } } …… VOID CALLBACK WinEventsProc(HWINEVENTHOOK hWinEventHook, DWORD dwEvent, HWND hwnd, LONG idObject, LONG idChild, DWORD dwEventThread, DWORD dwmsEventTime ) { switch(dwEvent) { case EVENT_SYSTEM_SWITCHSTART: CSetWinEventHookDlg::ChangUI(_T("Alt+Tab Start")); break; case EVENT_SYSTEM_SWITCHEND: CSetWinEventHookDlg::ChangUI(_T("Alt+Tab End")); break; case EVENT_SYSTEM_MENUPOPUPSTART: CSetWinEventHookDlg::ChangUI(_T("PopMenu Start")); break; case EVENT_SYSTEM_MENUPOPUPEND: CSetWinEventHookDlg::ChangUI(_T("PopMenu End")); break; } }
相关文章推荐
- SetWinEventHook 事件钩子(有些windows事件并没有消息对应,譬如弹出菜单,切换窗口,获得焦点,滚动条滚动等)good
- 应用SetWinEventHook截获Windows事件
- SetWindowsHookExW与SetWinEventHook
- SetWinEventHook和SetWindowsHookEx的异同[转]
- 0.ring3-SetWinEventHook和SetWindowsHookEx
- SetWinEventHook和SetWindowsHookEx的异同
- SetWinEventHook和SetWindowsHookEx的异同
- SetWinEventHook和SetWindowsHookEx的异同
- 钩子函数compositionframeworkhook的事件点顺序
- javascript绑定事件addEventListener与attachEvent
- 事件(Event),绝大多数内存泄漏(Memory Leak)的元凶[上篇]
- Flex的拖动事件 DragEvent DragManager
- SOA EDA 事件驱动架构 (Event-Driven Architecture,EDA) 简介
- 各种各样的hook钩子用于截获操作系统中不同消息队列的消息
- 《WF编程》系列之29 - 本地通信事件:HandleExternalEventActivity & 活动生成器
- 事件(Event),绝大多数内存泄漏(Memory Leak)的元凶[下篇] (提供Source Code下载)
- c#学习笔记之九 事件(event)的使用,一个简单的例子揭示其设计理念
- event loop js事件循环 microtask macrotask
- 局部QEventLoop帮助QWidget不消失(也就是有一个局部事件循环始终在运行,导致程序被卡住那里,但仍可以接受事件。说白了就是有一个while语句死活不肯退出,直到收到退出信号)
- android 事件处理机制之requestDisallowInterceptTouchEvent