如何在 C++ 中模拟按住一个键

How to Simulate Holding Down a Key in C++

让我更具体一点..

我正在尝试在我正在开发的游戏宏机器人中模拟向前行走...

这个游戏是 运行 通过我的 Chrome 浏览器。我需要这段代码来完成的就是在记事本或其他东西中生成“wwwwwwwwwwwwwww”,因为按住了键。

据我所知,这不是兼容性错误,而是逻辑错误...

这是我的路障的一个简单示例:

#include <windows.h>

void keyPress(WORD keyCode) 
{
    INPUT input;
    input.type = INPUT_KEYBOARD;

    input.ki.wVk = keyCode;
    input.ki.dwFlags = 0;
    SendInput(1, &input, sizeof(input)); // Press key?

    Sleep(3000); // Key suppose to be held for 3 seconds but isnt??

    input.ki.dwFlags = KEYEVENTF_KEYUP;
    SendInput(1, &input, sizeof(input)); // Release key?
}

int main()
{
    keyPress(0x57); // 0x57 = W key code
    return 0;
}

SendInput() 似乎是用于按键模拟的函数,但如果我应该使用不同的东西,请分享!

谢谢。

解决方案:好的,通过进一步体验,我的原始代码的问题似乎是我的 dwFlags 中缺少 KEYEVENTF_SCANCODE。似乎有一个潜在的关系需要 KEYEVENTF_SCANCODE 标志,以便至少在 Chrome 中按住箭头键,也许是系统范围的。所以这是 bare-bones 解决方案:

#include <windows.h>

void keyPress(WORD keyCode)
{
    INPUT input;
    input.type = INPUT_KEYBOARD;
    input.ki.wScan = keyCode;
    input.ki.dwFlags = KEYEVENTF_SCANCODE;

    SendInput(1, &input, sizeof(INPUT));
}

void keyRelease(WORD keyCode)
{
    INPUT input;
    input.type = INPUT_KEYBOARD;
    input.ki.wScan = keyCode;
    input.ki.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP;

    SendInput(1, &input, sizeof(INPUT));
}

int main()
{
    Sleep(5000); // pause time to open browser tab
    keyPress(0x24); // press key
    Sleep(1000); // hold key for x milliseconds
    keyRelease(0x24); // release key
    return 0;
}

我很困惑为什么扫描码与微软提供的扫描码不一致(“0x25”是向下箭头而不是“0x28”?)所以如果有人对此有所了解,那就太好了。

解决方案编辑:我的键码没有对齐的原因是因为我需要使用扫描码。我运气不好,因为我玩的游戏也使用 IJKL 作为箭头键,所以它看起来好像代码被几个数字偏移了,而实际上它一直在按字母键。所以基本上我需要做的就是使用这些扫描码移动:0x17="I" 0x24="J" 0x25="K" 0x26="L"

我希望这能帮助像我一样迷茫的人 (:

此外,专业提示,在 python 中编写宏机器人代码,这更不会令人头疼。我放弃了我的 C++ 代码,并在 2 个晚上

上 python 获得了我的代码 运行