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

问题描述 投票:0回答:1

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

这个游戏是通过我的Chrome浏览器运行的。我需要这段代码来完成的就是在记事本窗口中生成

wwwwwwwwwwwwww
或由于按住按键而产生的东西。

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

这是我遇到的障碍的一个简单示例:

#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()
似乎是用于按键模拟的函数,但如果我应该使用不同的东西,请分享!

c++ macros keyboard bots sendinput
1个回答
2
投票

解决方案:好的,通过进一步的经验,我的原始代码的问题似乎是我的 dwFlags 中缺少 KEYEVENTF_SCANCODE。似乎存在一种潜在的关系,需要 KEYEVENTF_SCANCODE 标志才能至少在 Chrome 中(也许是系统范围内)按住箭头键。所以这是最简单的解决方案:

#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 上运行

© www.soinside.com 2019 - 2024. All rights reserved.