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

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

本文关键字:键盘 按钮 模拟 C++      更新时间:2023-10-16

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

该程序应该适用于需要按住 W,A,S,D 等按钮的游戏。我在侠盗猎车手V和Garry's 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's Mod中有效,但在侠盗猎车手V中不起作用:

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

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

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

编辑:我搜索了更多,发现这个:https://stackoverflow.com/a/3647975/1587051

事实证明,我使用的是Unicode而不是键盘扫描代码KEYEVENTF_SCANCODE并结合了标志。直接输入游戏现在可以正确接收击键。

为了参考起见,正如注释中已经回答的那样,您必须使用 SendInput 而不是 SendMessage ,在填充SendInput功能所需的INPUT结构时,请确保将FlagsKEYEVENTF_SCANCODE相结合以发送硬件信号而不是虚拟信号。这些将由 DirectInput 处理。来源 : 在直接输入应用程序中使用 SendInput API 模拟键盘