在我正在开发的游戏宏机器人中,我试图模拟向前行走。
这个游戏是通过我的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()
似乎是用于按键模拟的函数,但如果我应该使用不同的东西,请分享!
解决方案:好的,通过进一步的经验,我的原始代码的问题似乎是我的 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 上运行