c++ - 如何解决“被忽略的击键”

标签 c++ windows winapi visual-c++ keyevent

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

更详细地讲:按下组合键(在我的情况下为CTRL + q和CTRL + e)后,程序的任务是模拟某些程序中的击键。如果您使用程序中的按钮,则一切正常,但是在添加捕获后,箭头停止了工作(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!
先感谢您!

最佳答案

解决方案很简单。在功能中,单击箭头时,需要另一个参数。

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

关于c++ - 如何解决“被忽略的击键”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57584444/

相关文章:

windows - 如何通过从命令行调用一些变量(如 edit 或 vi)在 Windows 中打开文本编辑器

c++ - 线程使用Qt发送http请求

c++ - 内存分配小题C++

c++ - 将 IMFSample* 转换为 ID3D11ShaderResourceView*

c# - 在 C# 中获取本地 Windows 用户登录 session 时间戳

windows - vim - 如何在复制文本时保持光标位置

c++ - 使用类成员作为 WNDPROC/DLGPROC 有或没有全局

winapi - MB_ERR_INVALID_CHARS 标志是否应该用于 MultiByteToWideChar 的 UTF-8 转换?

winapi - 为什么 64 位可移植可执行文件的入口点地址只有 32 位?

c++ less 运算符重载,用什么方法?