【问题标题】:How do I send release key with directInput? [closed]如何使用 directInput 发送释放键? [关闭]
【发布时间】: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,但我无法让它工作

【问题讨论】:

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

标签: c# keyboard directinput


【解决方案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]));

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-24
    • 2012-10-28
    • 1970-01-01
    • 2013-07-11
    • 2011-01-15
    • 2021-09-13
    相关资源
    最近更新 更多