如何在 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 获得了我的代码 运行
让我更具体一点..
我正在尝试在我正在开发的游戏宏机器人中模拟向前行走...
这个游戏是 运行 通过我的 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 获得了我的代码 运行