//创建窗口时安装勾子
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捕获键盘消息,苦恼中??
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捕获键盘消息,苦恼中??
LZ这样做,只能用低级键盘钩子。
用WH_KEYBOARD我也试过,一样不行的
SetWindowsHookEx 需要的是线程ID应该 dwThdId = GetWindowThreadProcessId(hFindWin,&dwId);
return dwThdId;