我在一个DLL中创建了一个线程
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
if (dwReason == DLL_PROCESS_ATTACH)
{
gInstance = hInstance;
if (!AfxInitExtensionModule(AssistDLL, hInstance))
return 0;
StartHook();
     }}
bool StartHook()
{

DWORD theThreadId;
HANDLE Trd = ::CreateThread(NULL,0,MyThread,NULL,0,&theThreadId);
if (!Trd) ::OutputDebugString("Creating Thread failed at StartHook()...."); 
else ::OutputDebugString("Thread created...."); 
return TRUE;
}
然后在线程中创建一个键盘钩子和消息钩子DWORD WINAPI MyThread(LPVOID lpParameter)//线程函数
{
g_hHook=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyboardProcg,gInstance, ::GetCurrentThreadId());
m_hHook=SetWindowsHookEx(WH_CALLWNDPROC , (HOOKPROC)CallWndProc, gInstance, ::GetCurrentThreadId());
::sprintf(tmp, "MyThread->g_hHook = %x, m_hHook=%x", g_hHook,m_hHook); 
::OutputDebugString(tmp); 
return 0;
}
结果发现,消息钩子可以成功创建(m_hHook不为0),而键盘钩子却不能创建(g_hHook总为零),不知是什么原因。我也试过下面的用法,结果都返回0g_hHook=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyboardProcg,gInstance, NULL);
g_hHook=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyboardProcg,::AfxGetInstanceHandle(), ::GetCurrentThreadId());