win7下不能收到窗口hook消息的问题

    技术2025-03-31  11

    win7下由于UIPI的限制, 高权限进程无法收到底权限进程发来的消息, 因此对窗口消息hook时无法接收到消息,解决办法是在调用SetWindowsHookEx之前先调用ChangeWindowMessageFilterEx, 该函数修改指定窗口的UIPI消息过滤设置。 原型如下:

    BOOL WINAPI ChangeWindowMessageFilterEx(        HWND hWnd,         UINT message,         DWORD action,         PCHANGEFILTERSTRUCT pChangeFilterStruct);第一个参数要改变设置的窗口句构, 第二个参数要过滤的消息, 第三个参数要执行的动作, 第四个参数指向一个CHANGEFILTERESTRUCT结构。该结构用于返回修改结果。 另外ChangeWindowMessageFilterEx在需要从user32中导出, 如下:BOOL CallChangeWindowMessageFilter(HWND hWnd, UINT nMsg, DWORD dwAction, PCHANGEFILTERSTRUCT chfit){ typedef BOOL (WINAPI *LPFUNC)(HWND, UINT, DWORD, PCHANGEFILTERSTRUCT);

     HMODULE hLib = LoadLibraryA("user32.dll");

     if (hLib) {  LPFUNC func = (LPFUNC)GetProcAddress(hLib, "ChangeWindowMessageFilterEx");    if (func && chfit)   return func(hWnd, nMsg, dwAction, chfit); }

     return FALSE;}如果要设置一个窗口消息构子可以这样调:CHANGEFILTERSTRUCT chfit = { sizeof(CHANGEFILTERSTRUCT) };CallChangeWindowMessageFilter(hWnd, WM_COPYDATA, MSGFLT_ALLOW, &chfit);g_hhookCBTMsg = SetWindowsHookExW(WH_CBT ,CBTProc, hDLL, 0);这样你的进程就可以获取来自底权限进程的消息。

    最新回复(0)