VC键盘钩子 模拟键盘输入 输出2遍如何解决
voidKeyDownTTT(){::keybd_event(0X57,0,KEYEVENTF_KEYUP,0);::keybd_event(0X57,0,0,0);}L...
void KeyDownTTT()
{
::keybd_event(0X57,0,KEYEVENTF_KEYUP,0);
::keybd_event(0X57,0,0,0);
}
LRESULT CALLBACK KeyboardProc(int code,WPARAM wParam,LPARAM lParam)
{
if(wParam == VK_TAB)
{
KeyDownTTT();
return 1;
}
return CallNextHookEx(g_hHook,code,wParam,lParam);
}
运行后按TAB 输出2遍w
即ww
如何解决这个问题 如何只让它输出一遍呢?
::keybd_event(0X57,0,0,0);
::keybd_event(0X57,0,KEYEVENTF_KEYUP,0);
写倒了 不过这不是重点 展开
{
::keybd_event(0X57,0,KEYEVENTF_KEYUP,0);
::keybd_event(0X57,0,0,0);
}
LRESULT CALLBACK KeyboardProc(int code,WPARAM wParam,LPARAM lParam)
{
if(wParam == VK_TAB)
{
KeyDownTTT();
return 1;
}
return CallNextHookEx(g_hHook,code,wParam,lParam);
}
运行后按TAB 输出2遍w
即ww
如何解决这个问题 如何只让它输出一遍呢?
::keybd_event(0X57,0,0,0);
::keybd_event(0X57,0,KEYEVENTF_KEYUP,0);
写倒了 不过这不是重点 展开
1个回答
展开全部
lParam: 30位 如果是按键按下后发送的消息,30位为1,如果是按键抬起后30位为0;
KeyboardProc你只判断了wParam,因此按下和抬起消息都会接收并处理,这样就是两次。
另外,你处理的过于简单,更安全的处理应该判断参数1:
code大于等于0,并且钩子处理函数没有处理消息,强烈建议您 返回CallNextHookEx()的返回值,否则当您安装WH_KEYBOARD钩子时,钩子将不会得到通知,并返回错误结果。如果钩子处理的消息,您可以返回一个非0值,防止系统把消息传递给钩子链中的下一个钩子,或者把消息发送到目标窗口。
KeyboardProc你只判断了wParam,因此按下和抬起消息都会接收并处理,这样就是两次。
另外,你处理的过于简单,更安全的处理应该判断参数1:
code大于等于0,并且钩子处理函数没有处理消息,强烈建议您 返回CallNextHookEx()的返回值,否则当您安装WH_KEYBOARD钩子时,钩子将不会得到通知,并返回错误结果。如果钩子处理的消息,您可以返回一个非0值,防止系统把消息传递给钩子链中的下一个钩子,或者把消息发送到目标窗口。
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询