hur.cn - 华软网

 热门搜索

keybd_event死循环的Bug

  作者:未知    来源:网络    更新时间:2010/12/8
我在钩子里拦截A、B、C按下的情况,拦截到后,并用keybd_event模拟按一个键,但恰巧模拟按的这个键是A(举例),结果造成了持续按A的死循环。

请问如何防止这类情况,在依然运用keybd_event的模拟按键的情况下?
---华软 网友回答---
思量复合键
---华软网友回复---
拦截并措置惩罚后,抛弃此消息
---华软网友回复---
我尝试一下,看能不能让程序知道哪是自己的消息,哪是人工按下的消息。
---华软网友回复---
拦截奇数次模拟按键,偶数次的应该是你模拟的直接跳过
---华软网友回复---
或收到第一个'A'后记录下当前时间,一定时间内,比如100ms内 再收到的‘A’就不要再发送模拟了
---华软网友回复---
要拦截的程序是你自己写的吗?
---华软网友回复---
示例代码,愿顺利,阿弥陀佛!
http://cid-3ba16e78a53d2d3d.office.live.com/self.aspx/VC/%E5%A4%8D%E4%BB%B6%20Lowlever%20Hook.zip


C++">

bool flag=false;

/****************************************************************************
低级键盘钩子
#define   _WIN32_WINNT   0x0500  //必需在stdafx.h中增加这一句
****************************************************************************/
HHOOK g_LowLevelKeyboardHook=NULL; //钩子句柄
LRESULT CALLBACK LowLevelKeyboardProc(int nCode,WPARAM wParam, LPARAM lParam)

if (nCode<0 )
return CallNextHookEx(g_LowLevelKeyboardHook,nCode,wParam,lParam);

switch (wParam)
{
case WM_KEYDOWN:
{
trace(    ((KBDLLHOOKSTRUCT*)lParam )->vkCode   );

if ( ((KBDLLHOOKSTRUCT*)lParam )->vkCode == 'A'  )
{
if (flag==true)
{
trace("捕捉到模拟按键");
break;
}

trace("起头模拟a按键");

//当下面调用keybd_event时,会致使立即又重入键盘钩子函数,
//执行完一次钩子函数后才回到这里。
//咱们设置了一个flag=true,由于运用keybd_event致使
//重入键盘函数时,判断flag为true,知道是模拟按键,直接前往
//默许操作。如果是flag==false,说明是捕捉到的键盘按键了。
//记住,一定要运用低级键盘钩子,一般的键盘钩子调用keybd_event
//不会致使马上重入钩子函数。
flag=true;
keybd_event('A',0,0,0);
keybd_event('A',0,KEYEVENTF_KEYUP,0);
flag=false;

trace("结束模拟a按键");

return 1;
}
}
}

return CallNextHookEx(g_LowLevelKeyboardHook,nCode,wParam,lParam); //传送钩子信息 




void CDemoDlg::OnButton1() 
{


//start Low Level Keyboard hook
g_LowLevelKeyboardHook=SetWindowsHookEx(WH_KEYBOARD_LL,LowLevelKeyboardProc,GetModuleHandle(NULL),0);
if(!g_LowLevelKeyboardHook)
::MessageBox(m_hWnd,TEXT("SetWindowsHookEx LowLevelKeyboardProc failed"),NULL,MB_OK);
}


     
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。