SetWindowsHookExW与SetWinEventHook

来源:互联网 发布:pptv网络电视在线直播 编辑:程序博客网 时间:2024/06/06 07:51

今天用消息钩子SetWindowsHookExW和事件钩子SetWinEventHook完成了对鼠标按下弹起消息和窗体移动事件的捕获。


当然也可以不用创建线程,把其中的处理过程写在主函数里。


#include<iostream>#include<windows.h>using namespace std;void CALLBACK MyWinEventProc(HWINEVENTHOOK hWinEventHook, DWORD dwEvent, HWND hwnd, LONG idObject, LONG idChild, DWORD dwEventThread, DWORD dwmsEventTime){switch (dwEvent){case EVENT_SYSTEM_MOVESIZESTART:cout << "EVENT_SYSTEM_MOVESIZESTART" << endl;break;case EVENT_SYSTEM_MOVESIZEEND:cout << "EVENT_SYSTEM_MOVESIZEEND" << endl;break;}}LRESULT CALLBACK LowLevelMouseProc(int nCode,WPARAM wParam,LPARAM lParam){if (wParam == WM_LBUTTONDOWN){cout << "WM_LBUTTONDOWN" << endl;}else if (wParam == WM_LBUTTONUP){cout << "WM_LBUTTONUP" << endl;}return CallNextHookEx(0, nCode, wParam, lParam);}DWORD WINAPI Message_ThreadProc(LPVOID lpParameter){MSG msg;HHOOK mouse_hook = SetWindowsHookExW(WH_MOUSE_LL, LowLevelMouseProc, GetModuleHandleW(0), 0);if (mouse_hook == NULL){}HWINEVENTHOOK event_hook = ::SetWinEventHook(EVENT_MIN, EVENT_MAX, NULL, MyWinEventProc, 0, 0, WINEVENT_OUTOFCONTEXT);if (event_hook == NULL){}while (GetMessageW(&msg, 0, 0, 0))DispatchMessageW(&msg);return 0;}int main(){HANDLE Message_ThreadHandle = CreateThread(0, 0, Message_ThreadProc, NULL, 0, NULL);while (1);return 0;}


最后记得用UnhookWinEvent和UnhookWindowsHookEx释放资源。


注:

WH_MOUSE_LL是低级鼠标钩子,不用新建dll即可捕获全局消息。

SetWinEventHook事件钩子都不用新建dll即可捕获全局事件。

原创粉丝点击