返回信息流我写了一个键盘钩子,其中用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)就好了,不知道其原因...
这是一条镜像帖。来源:北邮人论坛 / soft-design / #35568同步于 2009/9/1
该镜像源已超过 30 天没有更新,可能在源站已被删除。
SoftDesign机器人发帖
求助关于一个KeyboardProc和keybd_event的问题
lymickey
2009/9/1镜像同步5 回复
订阅后,新回复会通过你的通知中心匿名送达。
5 条回复
你自己最后一行不是给出答案了么...
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);
: ...................
我自学的C+和Mfc。看来还没学好……
你能对关于“为何是两次”说详细些吗,是不是HC_ACTION屏避一次?这一次又算什么样的类型呢?
【 在 CNLAS 的大作中提到: 】
: 你自己最后一行不是给出答案了么...
: MSDN里已经很详细的给出了HC_ACTION和HC_NOREMOVE的解释了。
: 不管是哪个hook回调基本原则是只处理HC_ACTION,有特殊需求另表
PeekMessage & HC_NOREMOVE
关键词给你了...自己去看吧...
【 在 lymickey 的大作中提到: 】
: 我自学的C+和Mfc。看来还没学好……
: 你能对关于“为何是两次”说详细些吗,是不是HC_ACTION屏避一次?这一次又算什么样的类型呢?
我还是不明白。。。。
当从消息队列中取出消息后是属于HC_ACTION类型的,我用了lparam限制了按键弹起的消息处理。怎么还是会是两次进入并弹出'on"对话框呢?
【 在 CNLAS 的大作中提到: 】
: PeekMessage & HC_NOREMOVE
: 关键词给你了...自己去看吧...