c++ win32 用 DirectInput 模拟按键

Posted

技术标签:

【中文标题】c++ win32 用 DirectInput 模拟按键【英文标题】:c++ win32 Simulate Keypress with DirectInput 【发布时间】:2011-09-06 13:09:53 【问题描述】:

如何使用 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 

那么谁能告诉我如何在游戏中模拟例如按下左箭头键?

【问题讨论】:

我是否理解正确:您想为不属于您的游戏模拟键盘和鼠标输入? 是的,对...就像绑定一样。我的意思是,例如,如果您按 Y,当我按键盘上的 Shift+Q 时,它应该做同样的事情。 KeyPress() 和 keybd_event() 不起作用,这就是我需要使用 DirectInput 的原因。 DirectInput 已被弃用,keybd_event() 也是如此。您是否尝试过使用 SendInput()?虽然我可以想象,当另一个程序获得焦点时,问题不仅在于发送输入,还在于接收它。 抱歉,在我之前的评论中的“KeyPress()”下,我想说的是 SendInput()。输入已发送,例如它可以写入游戏的字符,但在主屏幕中没有任何反应。 问题的答案是“您无法使用 DirectInput 生成输入。DirectInput 用于接收输入,而不是注入它。” 【参考方案1】:

发送输入

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

简而言之,将 SendInput 与扫描码一起使用,DirectInput 就会响应。

拦截

Interception 工具包使用内核模式驱动程序和一些用户模式帮助函数模拟按键。

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

the github page 上的评论表明它还不能在 Windows 8 中运行。

使用它需要您自担风险。

【讨论】:

这是一个不错的方法,但是我发现使用 SendInput 而不是虚拟键 Direct Input 发送扫描码也可以检测到“按键”。它只是在任何地方都没有足够好的记录,在我给出 100 多个代表之前,我恳请您更新您的答案,因为没有其他答案。

以上是关于c++ win32 用 DirectInput 模拟按键的主要内容,如果未能解决你的问题,请参考以下文章

c++ win32编程问题

用C++在Win32中用LoadImage()绘制HBITMAP的二维数组

如何使用 directInput 发送释放键? [关闭]

C++ Win32 API 控制消息

汇编语言中的CPU的16位,32位和当今操作系统所指的32位,64位概念有点模湖,请大侠们赐教.

c++ win32输出一个文本