使用DirectInput模拟键盘按键的C++ Win32代码

5
我该如何使用DirectInput模拟按键?我目前已经有了初始化代码(但是不确定是否正确):
#include <dinput.h>

#pragma comment (lib, "dinput8.lib")
#pragma comment (lib, "dxguid.lib")

LPDIRECTINPUT8 din;    // the pointer to our DirectInput interface
LPDIRECTINPUTDEVICE8 dinkeyboard;    // the pointer to the keyboard device
BYTE keystate[256];    // the storage for the key-information

void initDInput(HINSTANCE hInstance, HWND hWnd);    // sets up and initializes DirectInput
void detect_input(void);    // gets the current input state
void cleanDInput(void);    // closes DirectInput and releases memory 

那么有人能向我展示如何模拟在游戏中按下左箭头键吗?


我理解的对吗:你想为一个不属于你的游戏模拟键盘和鼠标输入? - Tobias Schlegel
1
DirectInput已被弃用,keybd_event()也一样。你尝试使用SendInput()了吗?虽然我能想象到,当另一个程序拥有焦点时,问题不仅在于发送输入,还在于接收它。 - Tobias Schlegel
问题的答案是:“您无法使用DirectInput生成输入。 DirectInput用于接收输入,而不是注入它。” - Raymond Chen
这是一个旧的帖子,但你可能会发现有趣的是阅读我们在这个帖子上的讨论。 - karlphillip
@RaymondChen:尽管大部分问题都涉及到钩子,但如果你想向使用DirectInput编写的程序发送输入,你需要理解DirectInput以便钩住相应的函数/方法。在这方面,你可以使用DirectInput编写一个钩子函数,这样你就可以使用DirectInput来生成输入了 ;) - Tom
显示剩余2条评论
1个回答

9

SendInput

SendInput允许您模拟按键。您可以选择使用虚拟键代码或扫描代码来识别按键(请参见KEYBDINPUT.dwFlags)。显然,DirectInput忽略虚拟键代码但会处理扫描代码。

简而言之,使用具有扫描代码的SendInput,DirectInput将对其做出响应。

Interception

Interception工具包是通过内核模式驱动程序和一些用户模式辅助函数来模拟按键。

有一些安全问题。由于它是封闭源内核模式驱动程序,因此您需要完全信任作者。即使作者是完全值得信任的,驱动程序也允许监视输入并创建输入,因此这会打开一个巨大的安全漏洞:任何非特权软件都可以使用它来嗅探提权密码等内容。它还可以阻止键盘输入,包括CTRL + ALT + DEL。

github页面上的评论表明它尚无法在Windows 8中使用。

风险自负。


1
这是一个不错的方法,但我发现使用SendInput发送扫描码而不是虚拟键可以使Direct Input也能够检测到“按键”。只是这个方法并没有得到很好的记录和文档,在我给你提供100+的声望前,我恳请你更新一下你的回答,因为目前还没有其他的答案。 - user1182183

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接