BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / soft-design / #35568同步于 2009/9/1
该镜像源已超过 30 天没有更新,可能在源站已被删除。
SoftDesign机器人发帖

求助关于一个KeyboardProc和keybd_event的问题

lymickey
2009/9/1镜像同步5 回复
我写了一个键盘钩子,其中用keybd_event来模拟按键,部分代码如下: extern "C" bool WINAPI startHook(DWORD threadid){ hhk=::SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,ph,threadid); return (hhk==NULL?false:true); } extern "C" LRESULT CALLBACK KeyboardProc(int code,WPARAM wParam,LPARAM lParam){ static bool isShow=false; CString temp1("on"); CString temp2("off"); CString temp("test"); //如果按下了end键 if((lParam&0x80000000)&&wParam==VK_END) { ::AfxMessageBox(temp); if(isShow==false){ ::AfxMessageBox(temp1); ::keybd_event(VK_OEM_4,0,0,0); ::keybd_event(VK_OEM_6,0,0,0); isShow=true; } else if(isShow){ ::AfxMessageBox(temp2); ::keybd_event(VK_OEM_4,0,KEYEVENTF_KEYUP,0); ::keybd_event(VK_OEM_6,0,KEYEVENTF_KEYUP,0); isShow=false; } } return ::CallNextHookEx(hhk,code,wParam,lParam); } 现出来一个问题:按了下End键后,会弹出两次test消息框,两次on消息框,而非一次。 如果在keyboardproc中最前面加了一个条件if(code==HC_ACTION)就好了,不知道其原因...
订阅后,新回复会通过你的通知中心匿名送达。
5 条回复
CNLAS机器人#1 · 2009/9/1
你自己最后一行不是给出答案了么... MSDN里已经很详细的给出了HC_ACTION和HC_NOREMOVE的解释了。 不管是哪个hook回调基本原则是只处理HC_ACTION,有特殊需求另表 【 在 lymickey (天使之翼ly) 的大作中提到: 】 : 我写了一个键盘钩子,其中用keybd_event来模拟按键,部分代码如下: : extern "C" bool WINAPI startHook(DWORD threadid){ : hhk=::SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,ph,threadid); : ...................
lymickey机器人#2 · 2009/9/2
我自学的C+和Mfc。看来还没学好…… 你能对关于“为何是两次”说详细些吗,是不是HC_ACTION屏避一次?这一次又算什么样的类型呢? 【 在 CNLAS 的大作中提到: 】 : 你自己最后一行不是给出答案了么... : MSDN里已经很详细的给出了HC_ACTION和HC_NOREMOVE的解释了。 : 不管是哪个hook回调基本原则是只处理HC_ACTION,有特殊需求另表
CNLAS机器人#3 · 2009/9/2
PeekMessage & HC_NOREMOVE 关键词给你了...自己去看吧... 【 在 lymickey 的大作中提到: 】 : 我自学的C+和Mfc。看来还没学好…… : 你能对关于“为何是两次”说详细些吗,是不是HC_ACTION屏避一次?这一次又算什么样的类型呢?
lymickey机器人#4 · 2009/9/3
顶下
lymickey机器人#5 · 2009/9/3
我还是不明白。。。。 当从消息队列中取出消息后是属于HC_ACTION类型的,我用了lparam限制了按键弹起的消息处理。怎么还是会是两次进入并弹出'on"对话框呢? 【 在 CNLAS 的大作中提到: 】 : PeekMessage & HC_NOREMOVE : 关键词给你了...自己去看吧...