win7下不能收到視窗hook訊息的問題

來源:互聯網
上載者:User

這幾天被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);

這樣你的進程就可以擷取來自底許可權進程的訊息。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.