3

直接入力を使用してキーを送信したい.キープレスを送信できた.しかし、キーを押し続けないようにキーリリースを送信する方法がわかりません.

これが私のコードです:

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]));
}

注 : DirectInput アプリケーションで SendInput API を使用してこのシミュレート キーボードを試しましたが、動作させることができませんでした

4

1 に答える 1

2

あなたが示したコードは、あなたが投稿したリンクのアドバイスに従っていないようです。実際には、あなたが行っていないキーアップを示しています:

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]));

私はそこから始めます。動作しているように見える他の投稿のメソッドを使用して動作しなかったコードを表示することをお勧めします。

于 2012-10-15T16:20:02.007 に答える