如何修复“忽略的击键”

Posted

技术标签:

【中文标题】如何修复“忽略的击键”【英文标题】:How to fix"Ignored keystrokes" 【发布时间】:2019-08-21 04:28:53 【问题描述】:

我的问题是,在添加了捕获键之后,我的代码开始不能正常工作。

更详细地说:按下组合键(在我的情况下是 CTRL + q 和 CTRL + e)后,程序的任务是模拟某个程序中的击键。如果您在程序中使用按钮,一切正常,但添加 catch 后,箭头停止工作(Enter 和 Esc 工作,我没有检查其余键)。

我需要在某些程序中进行快速搜索,在这些程序中,您必须多次按键盘上的箭头。

__declspec(dllexport) LRESULT CALLBACK KeyboardEvent(int nCode, WPARAM wParam, LPARAM lParam)

    DWORD CTRL_key = 0;

    if ((nCode == HC_ACTION) && ((wParam == WM_SYSKEYDOWN) || (wParam == WM_KEYDOWN)))
    
        KBDLLHOOKSTRUCT hooked_key = *((KBDLLHOOKSTRUCT*)lParam);
        DWORD dwMsg = 1;
        dwMsg += hooked_key.scanCode << 16;
        dwMsg += hooked_key.flags << 24;
        char lpszKeyName[1024] =  0 ;

        int i = GetKeyNameText(dwMsg, (lpszKeyName + 1), 0xFF) + 1;

        int key = hooked_key.vkCode;

        CTRL_key = GetAsyncKeyState(VK_CONTROL);

        if (key >= 'A' && key <= 'Z')
        

            if (CTRL_key != 0 && key == 'q')
            
                //MessageBox(NULL, "Pressed", "H O T K E Y", MB_OK);
                CTRL_key = 0;
                //
                Sleep(1000);
                keybd_event(VK_RETURN, 0x9C, 0, 0);
                Sleep(50);
                keybd_event(VK_RETURN, 0x9C, KEYEVENTF_KEYUP, 0);
                Sleep(100);
                for (int i = 0; i < 6; i++) 
                    keybd_event(VK_UP, 0x26, 0, 0);
                    Sleep(50);
                    keybd_event(VK_UP, 0x26, KEYEVENTF_KEYUP, 0);
                    Sleep(50);
                
                for (int i = 0; i < 5; i++) 
                    keybd_event(VK_RIGHT, 0x27, 0, 0);
                    Sleep(50);
                    keybd_event(VK_RIGHT, 0x27, KEYEVENTF_KEYUP, 0);
                    Sleep(50);
                
                keybd_event(VK_DOWN, 0x28, 0, 0);
                Sleep(50);
                keybd_event(VK_DOWN, 0x28, KEYEVENTF_KEYUP, 0);
                keybd_event(VK_RETURN, 0x9C, 0, 0);
                Sleep(50);
                keybd_event(VK_RETURN, 0x9C, KEYEVENTF_KEYUP, 0);
                Sleep(50);
                Sleep(6000);
                keybd_event(VK_ESCAPE, 0x1B, 0, 0);
                Sleep(500);
                keybd_event(VK_ESCAPE, 0x1B, KEYEVENTF_KEYUP, 0);
                Sleep(1000);
            

            if (CTRL_key != 0 && key == 'e')
            
                MessageBox(NULL, "Shutting down", "H O T K E Y", MB_OK);
                PostQuitMessage(0);
            

            CTRL_key = 0;
        

    
    return CallNextHookEx(hKeyboardHook, nCode, wParam, lParam);

如果您想查看完整代码,请点击here! 提前谢谢!

【问题讨论】:

箭头不工作的情况是什么?当我按下 CRTL+q 时,它将执行一系列keybd_event() 操作,我的箭头仍然有效。并且,keybd_event 功能已被取代。你应该改用SendInput 在我的程序中只有 ESC 按钮可以使用这个功能... 我认为问题出在抓键功能上。可能它以某种方式阻止了通过该功能输入的键。我想是的,因为当我没有抓住钥匙时,一切都顺利进行。 【参考方案1】:

解决方案很简单。在函数中,当你点击箭头时,需要另一个参数。

                    keybd_event(VK_UP, 0x26, KEYEVENTF_EXTENDEDKEY, 0);
                    Sleep(50);
                    keybd_event(VK_UP, 0x26, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);

【讨论】:

以上是关于如何修复“忽略的击键”的主要内容,如果未能解决你的问题,请参考以下文章

如何修复drv?

如何修复 npm 审计修复问题?

如何修复WMI

如何修复AppScan漏洞

如何在DOS环境下修复系统

如何修复这些漏洞? (npm audit fix 无法修复这些漏洞)