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

Posted

技术标签:

【中文标题】如何使用 directInput 发送释放键? [关闭]【英文标题】:How do I send release key with directInput? [closed] 【发布时间】:2012-10-15 16:09:04 【问题描述】:

我想使用直接输入发送键。我能够发送按键。但是我不知道如何发送按键释放以避免按住按键。

这是我的代码:

struct INPUT

  public UInt32 type;
  public ushort wVk;
  public ushort wScan;
  public UInt32 dwFlags;
  public UInt32 time;
  public UIntPtr dwExtraInfo;
  public UInt32 uMsg;
  public ushort wParamL;
  public ushort wParamH;



enum SendInputFlags

  KEYEVENTF_EXTENDEDKEY = 0x0001,
  KEYEVENTF_KEYUP = 0x0002,
  KEYEVENTF_UNICODE = 0x0004,
  KEYEVENTF_SCANCODE = 0x0008,


[DllImport("user32.dll")]
static extern UInt32 SendInput(UInt32 nInputs, 
  [MarshalAs(UnmanagedType.LPArray, SizeConst = 1)] INPUT[] pInputs, 
  Int32 cbSize);

public static void StrokeW()

  INPUT[] InputData = new INPUT[1];
  ushort ScanCode = 0x11;
  InputData[0].type = 1;
  InputData[0].wScan = (ushort)ScanCode;
  InputData[0].dwFlags = (uint)SendInputFlags.KEYEVENTF_SCANCODE;
  SendInput(1, InputData, Marshal.SizeOf(InputData[0]));

注意:我试过这个Simulating Keyboard with SendInput API in DirectInput applications,但我无法让它工作

【问题讨论】:

请不要在有人花时间为您回答问题后删除问题。 我是回答它的人,第一个回答没有帮助:) 好吧,这很公平。我之前没有注意到你的回答。 【参考方案1】:

您演示的代码似乎没有遵循您发布的链接上的建议,这实际上显示了您没有执行的 keyup

INPUT[] InputData = new INPUT[2];

InputData[0].type = 1; //INPUT_KEYBOARD
InputData[0].wScan = (ushort)ScanCode;
InputData[0].dwFlags = (uint)SendInputFlags.KEYEVENTF_SCANCODE;

InputData[1].type = 1; //INPUT_KEYBOARD
InputData[1].wScan = (ushort)ScanCode;
InputData[1].dwFlags = (uint)(SendInputFlags.KEYEVENTF_KEYUP 
                              | SendInputFlags.KEYEVENTF_UNICODE);

SendInput(2, InputData, Marshal.SizeOf(InputData[0]));

我会从那里开始。最好显示您编写的代码,但使用其他似乎有效的帖子中的方法不起作用。

【讨论】:

以上是关于如何使用 directInput 发送释放键? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

为啥我无法使用 DirectInput 获取键盘?

如何使用 DirectInput 在我的游戏中创建聊天框?

如何确定在 DirectInput 中断开的键盘

从 Direct Input 和 GetDeviceState() (C++) 接收键状态

在特定时间释放一个键会重置序列吗?

我应该使用 DirectInput 还是 Windows 消息循环?