我正在尝试制作一个模拟按住键盘按钮的程序。
此程序应该适用于游戏,其中需要按住 W,A,S,D 等按钮。我在侠盗猎车手V和Garry的Mod中测试了这个程序,但它在其中任何一个都没有用。
我尝试使用SendInput
和keybd_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游戏现在正确接收击键。
答案 0 :(得分:1)
为了参考起见,正如评论中已经回答的那样,在填写SendInput
所需的SendMessage
结构时,您必须使用INPUT
而不是SendInput
功能确保您将Flags
与KEYEVENTF_SCANCODE
合并,以发送硬件信号而不是虚拟信号。这些将由DirectInput处理。
资料来源:Simulating Keyboard with SendInput API in DirectInput applications