DLL_KB_API BOOL StartHook(HWND hwnd)
{
if (!hwnd)
return FALSE;
BOOL result = FALSE;
// 安装钩子
g_hHook = (HWND)::SetWindowsHookEx(WH_KEYBOARD, KeyBoardProc,glhInstance,0);
if (g_hHook != NULL)
result = TRUE;
g_hwnd = hwnd;
return result;
}
DLL_KB_API BOOL StopHook()
{
BOOL result = FALSE;
if (g_hHook)
{
result = UnhookWindowsHookEx((HHOOK)g_hHook);
if (result)
{
g_hwnd = g_hHook = NULL;
}
}
return result;
}
LRESULT __stdcall KeyBoardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode == HC_ACTION)
{
// 此过程只转发消息,并不阻断消息,故而都要CallNextHookEx
if (VK_F9 == wParam)
{
::PostMessage(g_hwnd, QUEUE_PROGRAM_ACCELERATOR_MSG, wParam, 0);
}
}
return CallNextHookEx((HHOOK)g_hHook, nCode, wParam, lParam);
}
程序中的消息处理代码如下:
ON_MESSAGE(QUEUE_PROGRAM_ACCELERATOR_MSG, &CQueueProgramDlg::PretendKeyboardAccelerator)
LRESULT CQueueProgramDlg::PretendKeyboardAccelerator(WPARAM wparam, LPARAM lparam)
{
switch (wparam)
{
case VK_F9:
OnBnClickedBtnCallNext();
break;
default:
break;
}
return 0;
}
求大神帮忙
我在PostMessage的lparam参数中传入该dll的实例句柄,在接受消息的主程序中调试,发现两次消息来自同一挂钩dll的不同实例!!!为什么会出现这样???
在你发送一个字母的过程中,键盘实际上发生了两个动作:down
和up,所以有两条消息。