LeeVondge 2018-12-10 10:32 采纳率: 0%
浏览 804

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

  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;
}

求大神帮忙
  • 写回答

2条回答 默认 最新

  • LeeVondge 2018-12-10 10:50
    关注

    我在PostMessage的lparam参数中传入该dll的实例句柄,在接受消息的主程序中调试,发现两次消息来自同一挂钩dll的不同实例!!!为什么会出现这样???

    评论

报告相同问题?

悬赏问题

  • ¥15 高德地图点聚合中Marker的位置无法实时更新
  • ¥15 DIFY API Endpoint 问题。
  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办