使用挂钩截获键盘按键,发送消息给目标窗口,却收到两条消息???

  1. 我想使用键盘钩子来截获键盘消息,在任何程序界面按下F9,挂钩处理过程会使用PostMessage发送一个自定义消息给我的程序,程序会进行处理。但是现在发现每次发送消息都会使得程序收到两条一模一样的消息,结果处理两次,求解!!!
  2. 挂钩代码如下: ```

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,所以有两条消息。