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

时间:2015-06-19 11:14:56

标签: c++ winapi

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

此程序应该适用于游戏,其中需要按住 W,A,S,D 等按钮。我在侠盗猎车手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秒。

我尝试在网上搜索,但没有找到任何可行的实施方式。

编辑:我搜索了更多内容并发现了这一点:https://stackoverflow.com/a/3647975/1587051

事实证明我使用的是Unicode而非键盘扫描码以及KEYEVENTF_SCANCODE标志。 DirectInput游戏现在正确接收击键。

1 个答案:

答案 0 :(得分:1)

为了参考起见,正如评论中已经回答的那样,在填写SendInput所需的SendMessage结构时,您必须使用INPUT而不是SendInput功能确保您将FlagsKEYEVENTF_SCANCODE合并,以发送硬件信号而不是虚拟信号。这些将由DirectInput处理。 资料来源:Simulating Keyboard with SendInput API in DirectInput applications