【问题标题】:c++ win32 Simulate Keypress with DirectInputc++ win32 用 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 用于接收输入,而不是注入它。”

标签: c++ c winapi directinput


【解决方案1】:

发送输入

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

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

拦截

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

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

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

使用它需要您自担风险。

【讨论】:

  • 这是一个不错的方法,但是我发现使用 SendInput 而不是虚拟键 Direct Input 发送扫描码也可以检测到“按键”。它只是在任何地方都没有足够好的记录,在我给出 100 多个代表之前,我恳请您更新您的答案,因为没有其他答案。
猜你喜欢
  • 2014-01-19
  • 2020-04-29
  • 2011-03-04
  • 2011-11-10
  • 2012-02-15
  • 1970-01-01
  • 2021-03-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多