//创建窗口时安装勾子
case WM_CREATE:
dwId = GetThreadId("1.txt - 记事本");
hModule = ::LoadLibrary("..\\KeyHookLib\\Debug\\KeyHookLib.dll");
if ( hModule != NULL)
{
PFNEXPORTFUNC mSetKeyHook = (PFNEXPORTFUNC)::GetProcAddress(hModule,"SetKeyHook");
if (mSetKeyHook != NULL)
{
mSetKeyHook(TRUE,dwId,hwnd);
}

}
::FreeLibrary(hModule);
return 0;
//获取打开窗口程序的进程ID
DWORD GetThreadId(LPSTR szWinName)
{
HWND hFindWin;
DWORD dwId; hFindWin = FindWindow(NULL,szWinName);
if (hFindWin != NULL)
{
GetWindowThreadProcessId(hFindWin,&dwId);
return dwId;
}
else
return FALSE;
}
//安装勾子函数
BOOL WINAPI SetKeyHook(BOOL bInstall, DWORD dwThreadId, HWND hWndCaller)
{
BOOL bOk;
g_hWndCaller = hWndCaller;

if(bInstall)
{
g_hHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyHookProc, 
ModuleFromAddress(KeyHookProc), dwThreadId);
g_hWndTitle = g_hWndCaller;
bOk = (g_hHook != NULL);

else 
{
bOk = UnhookWindowsHookEx(g_hHook);
g_hHook = NULL;
}

return bOk;
}
我调试过每次dwID多能传入正确的进程ID,可是为什么进入安装勾子函数,g_hHook 总是返回0啊,如果我调用全局勾子程序能完成工作,换成进程ID就不行了,我只想让1.txt捕获键盘消息,苦恼中??

解决方案 »

  1.   

    GetLastError()查看错误码,用Error Lookup工具查看错误解释。
      

  2.   

    本地钩子只能钩本进程的消息,现在你要钩notepad.exe的键盘,。
    LZ这样做,只能用低级键盘钩子。
      

  3.   

    我用的不是本地勾子啊,我把它写在DLL里面
    用WH_KEYBOARD我也试过,一样不行的
      

  4.   

    仔细看你的函数 GetThreadIdGetWindowThreadProcessId(hFindWin,&dwId);这个dwId 是进程ID 不是线程ID
    SetWindowsHookEx 需要的是线程ID应该 dwThdId  = GetWindowThreadProcessId(hFindWin,&dwId);
         return dwThdId;
      

  5.   

    恩,问题解决了,谢谢zzz3265(zzz)