- 我想使用键盘钩子来截获键盘消息,在任何程序界面按下F9,挂钩处理过程会使用PostMessage发送一个自定义消息给我的程序,程序会进行处理。但是现在发现每次发送消息都会使得程序收到两条一模一样的消息,结果处理两次,求解!!!
- 挂钩代码如下: ```
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;
}
求大神帮忙