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

How to simulate holding down a keyboard button in C++

我正在尝试制作一个可以模拟按住键盘按钮的程序。

这个程序应该在游戏中运行,需要按住 W,A,S,D 等按钮。我在 Grand Theft Auto V 和 Garry 的 Mod 中测试了该程序,但它在其中任何一个中都不起作用。

我尝试使用 SendInputkeybd_event 函数来模拟输入,但没有成功。

#include <windows.h>
#define VK_W 0x57

using namespace std;

int main(){
    while(1){
        keybd_event(VK_W, 0, 0, 0);
        Sleep(3000);  //should hold W for 3 seconds
        keybd_event(VK_W, 0, KEYEVENTF_KEYUP, 0);
        Sleep(1000);
    }
    return 0;
}

我已经使用 Razer 的键盘软件创建了宏,效果非常好,所以必须有一种方法来模拟按键输入。

我还尝试创建一个 AutoHotkey 脚本,它在 Garry 的 Mod 中有效,但在侠盗猎车手 V 中无效:

w::
SendInput {w down}
Sleep 3000
SendInput {w up}

此脚本在按下 W 时保持 W 3 秒。

我尝试在网上搜索,但没有找到任何有效的实现。

编辑:我又搜索了一些,发现了这个:

原来我使用的是 Unicode 而不是结合 KEYEVENTF_SCANCODE 标志的键盘扫描码。 DirectInput 游戏现在可以正确接收击键。

作为参考,因为已经在评论中回答了,所以在填写[=]所需的INPUT结构时,您必须使用SendInput而不是SendMessage 10=] 函数确保您将 FlagsKEYEVENTF_SCANCODE 结合使用以发送硬件信号而不是虚拟信号。这些将由 DirectInput 处理。 资料来源:Simulating Keyboard with SendInput API in DirectInput applications