這幾天被win7下的全域鉤子困惑了很久,一直以為Win7下的全域鉤子沒什麼變化,一直以為是自己的代碼寫錯了....今天還在抓狂的時候被同事一語驚醒夢中人,原來TMD微軟把Win7的全域hook和以前不一樣了!!在網上查了一圈,果然是這樣,哎~~又犯慣性思維的老毛病了,先把記下來吧,明天再驗證一下。。。
感謝一下原貼作者!
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) };
ChangeWindowMessageFilter(hWnd, WM_COPYDATA, MSGFLT_ALLOW, &chfit);
g_hhookCBTMsg = SetWindowsHookExW(WH_CBT ,CBTProc, hDLL, 0);
這樣你的進程就可以擷取來自底許可權進程的訊息。