2010-12-08 159 views
3

我试图设置一个WH_CBT钩子,并且它一直返回0。 我检查了错误,我得到了错误1428.我研究了一下,发现我有一个hMod参数的问题,但我看不到我应该放入什么,而不是null。有谁知道我做错了什么?为什么SetWindowsHookEx返回0?

这是我的代码:

#include "stdafx.h" 
#include "Windows.h" 
#include <iostream> 
using namespace std; 

HHOOK hookHandle; 

LRESULT CALLBACK CBTProc(int nCode, WPARAM wParam, LPARAM lParam); 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
hookHandle = SetWindowsHookEx(WH_CBT,CBTProc,NULL,0); 

if(hookHandle == NULL) 
{ 
    cout << "ERROR CREATING HOOK: "; 
    cout << GetLastError() << endl; 
    getchar(); 
    return 0; 
} 

MSG message; 

while(GetMessage(&message, NULL, 0, 0) != 0) 
{ 
    TranslateMessage(&message); 
    DispatchMessage(&message); 
} 



cout << "Press any key to quit..."; 
getchar(); 

UnhookWindowsHookEx(hookHandle); 

return 0; 
} 

LRESULT CALLBACK CBTProc(int nCode,WPARAM wParam, LPARAM lParam) 
{ 
cout << "hello" << endl; 
    return CallNextHookEx(hookHandle, nCode, 
      wParam, lParam); 
} 

附:如果代码中有愚蠢的元素,我很抱歉。我不是编程的新手,仅仅是C++。

回答

1

使用GetModuleHandle(NULL)GetCurrentThreadId()来获取您需要传递给该函数的句柄和线程ID。

样品:

hookHandle = SetWindowsHookEx(WH_CBT,CBTProc, 
           GetModuleHandle(NULL), 
           GetCurrentThreadId()); 

至于洛根说,这将只挂钩当前进程。你需要把代码放在一个DLL中来开发一个系统钩子。

+0

怎么样?你能举个例子吗? – Oran 2010-12-08 14:29:23

+0

向我的回答添加了一个示例 – 2010-12-08 14:30:47

3

如果为指定挂钩为全局的threadid指定0。为了这个工作,挂钩需要注入其他进程。这意味着该钩子需要从DLL中暴露出来。您需要将挂钩过程移至dll,或者在您的过程中指定一个线程。