2013-11-04 138 views
2

我對SetWindowsHookEx和WH_CALLWNDPROC有個大問題!當使用SetWindowsHookEx函數當地鉤C++全局鉤子。爲什麼SetWindowsHookEx返回NULL?

HHOOK hook = SetWindowsHookEx(WH_CALLWNDPROC, CallWndProc, GetModuleHandle(NULL), GetCurrentThreadId()); 

所有工作正常,但是當我嘗試設置全局鉤子或鉤其他程序:

HHOOK hook = SetWindowsHookEx(WH_CALLWNDPROC, CallWndProc, GetModuleHandle(NULL), threadId); 

其中threadId = GetWindowThreadProcessId(window, NULL);
HWND window = ::FindWindow(NULL,"Program title");

我得到空在鉤...

我讀了非常多的掛鉤,但是,我不明白哪裏是w orng ... 我頭痛幾天。 非常感謝您的提問,並對我的英語感到抱歉。

+7

如果你想建立一個全局鉤子,鉤子程序必須是一個dll,你需要將該dll的'HMODULE'傳遞給'SetWindowsHookEx'。 – IInspectable

+0

要展開IInspectable的評論,請http://msdn.microsoft.com/en-us/library/windows/desktop/ms644990%28v=vs.85%29.aspx聲明「所有全局掛鉤函數必須位於庫中。」 – IronMensan

+3

頭疼你應該拿Panadol和喝水:) –

回答

2

一種方式做到這一點:

  1. 把你CallWndProc功能在一個DLL,函數使用DEF與以下內容的文件
  2. 出口:

EXPORTS 

    CallWndProc 
  1. 完成!
  2. (嘗試總是使用GetLastError當一個Win32 API失敗,並給出了結果,當你問的東西)