首页
社区
课程
招聘
[求助]低级键盘钩子问题附源码
发表于: 2011-4-28 22:43 6262

[求助]低级键盘钩子问题附源码

2011-4-28 22:43
6262
LRESULT CALLBACK LowLevelKeyboardProc(int nCode,WORD wParam,DWORD lParam)
{
        BOOL bPressed = FALSE;
        PKBDLLHOOKSTRUCT p = NULL;
       
       
        if (nCode == HC_ACTION)
        {
                p = (PKBDLLHOOKSTRUCT) lParam;
                switch (wParam)
                {
                case WM_KEYDOWN:
                case WM_SYSKEYDOWN:
                case WM_KEYUP:   
                case WM_SYSKEYUP:
                        if(p->vkCode == VK_LSHIFT)
                        {
                                bPressed ^= 1;
                                if(bPressed) OutputDebugString("bPressed = 1");
                                else                 OutputDebugString("bPressed = 0");
                                while(bPressed)
                                {
                                        keybd_event(0x70 , MapVirtualKey(0x70,0) , 0 , 0);        //按F1  
                                        Sleep(50);               
                                        keybd_event(0x70 , MapVirtualKey(0x70,0) , KEYEVENTF_KEYUP , 0);
                                                                                Sleep(300);

                                        keybd_event(0x71 , MapVirtualKey(0x71,0) , 0 , 0);        //按F2键  
                                        Sleep(50);               
                                        keybd_event(0x71 , MapVirtualKey(0x71,0) , KEYEVENTF_KEYUP , 0);
                                                        Sleep(300);
                                }                                break;
                        }
                default:
                        break;
                }
        }
        return ((int) CallNextHookEx(hHook,nCode,wParam,lParam));
}

原本是想按下左Shift键开始,再按下停止,结果发现死循环,跟踪一下Pressed一直是1,为什么呢? 本人初学者,望高手指点一二,谢谢

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 165
活跃值: (56)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
2
因为bPressed是局部变量
2011-4-28 22:52
0
雪    币: 222
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
谢谢2楼的回答!改成全局变量后,出现另外一个问题,没达到预期效果。现在的问题是:按一下左shift只执行一次,跟踪结果是while()中按下F1后,bPressed就成0了,本意是想按一次shift后,一直自动循环F1F2F1F2……直到下一次shift按键。求解。
2011-4-28 23:03
0
雪    币: 284
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
键盘底层,我晕,我吐血
2011-4-29 08:24
0
雪    币: 107
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
while(bPressed)
        {
          keybd_event(0x70 , MapVirtualKey(0x70,0) , 0 , 0);  //按F1  
          Sleep(50);               
          keybd_event(0x70 , MapVirtualKey(0x70,0) , KEYEVENTF_KEYUP , 0);
                    Sleep(300);

          keybd_event(0x71 , MapVirtualKey(0x71,0) , 0 , 0);  //按F2键  
          Sleep(50);               
          keybd_event(0x71 , MapVirtualKey(0x71,0) , KEYEVENTF_KEYUP , 0);
              Sleep(300);
        }        break;

我真没看出来 这个循环里 bPressed 是怎么变成零的
设计思路有问题

另外
   case WM_KEYDOWN:
    case WM_SYSKEYDOWN:
    case WM_KEYUP:
按下弹起你都关注 按一次SHIFT键盘做了两次标记变化 那么bPressed自然变回去了
2011-4-29 08:27
0
雪    币: 222
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
谢谢楼上各位老师指点!一是设置bPressed为全局变量,二是case WM_SYSKEYDOWN:后面加上break。非常感谢!尤其是起床就看到了tydef的详细解释,现在改成如下后,再按左Shift停不下来

LRESULT CALLBACK LowLevelKeyboardProc(int nCode,WORD wParam,DWORD lParam)
{
        PKBDLLHOOKSTRUCT p = NULL;

        if (nCode == HC_ACTION)
        {
                p = (PKBDLLHOOKSTRUCT) lParam;
                switch (wParam)
                {
                        case WM_KEYDOWN:
                        case WM_SYSKEYDOWN:
                                break;
                        case WM_KEYUP:   
                        case WM_SYSKEYUP:
                                if(p->vkCode == VK_LSHIFT)
                                {
                                        bPressed ^= 1;
                                        if(bPressed)        OutputDebugString("bPressed = 1");
                                        else                        OutputDebugString("bPressed = 0");
                                        while(bPressed)
                                        {
                                                keybd_event(0x70 , MapVirtualKey(0x70,0) , 0 , 0);  //按F1  
                                                Sleep(50);               
                                                keybd_event(0x70 , MapVirtualKey(0x70,0) , KEYEVENTF_KEYUP , 0);
                                                Sleep(300);

                                                keybd_event(0x71 , MapVirtualKey(0x71,0) , 0 , 0);  //按F2键  
                                                Sleep(50);               
                                                keybd_event(0x71 , MapVirtualKey(0x71,0) , KEYEVENTF_KEYUP , 0);
                                                Sleep(300);
                                        }
                                        break;
                                }
                        default:
                                break;
                }
        }
        return ((int) CallNextHookEx(hHook,nCode,wParam,lParam));
}
2011-4-29 10:25
0
雪    币: 222
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
高手帮忙看下,为什么bPressed一直等1呢?以后的shift按键一直进不了if(),为什么啊?在线求助
=============
问题解决,原来是while()死循环,跳不出来
2011-4-29 14:08
0
雪    币: 485
活跃值: (78)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
8
bPressed ^= 1; 这个明显用错了。改为 bPressed = !bPressed
2011-4-29 19:05
0
游客
登录 | 注册 方可回帖
返回
//