MSDN:https://msdn.microsoft.com/de-de/library/windows/desktop/ms645562(v=vs.85).aspxRAWINPUT結構在C#
我目前的C#結構是這樣的:
[StructLayout(LayoutKind.Explicit)]
public struct RawInput
{
[System.Runtime.InteropServices.FieldOffset(0)]
public RawInputHeader Header;
[System.Runtime.InteropServices.FieldOffset(16)]
public RawInputData Data;
}
[StructLayout(LayoutKind.Explicit)]
public struct RawInputData
{
[FieldOffset(0)]
public RawMouse Mouse;
[FieldOffset(0)]
public RawKeyboard Keyboard;
[FieldOffset(0)]
public RawHID HID;
}
[StructLayout(LayoutKind.Sequential)]
public struct RawHID
{
public int Size;
public int Count;
public IntPtr Data;
}
[StructLayout(LayoutKind.Sequential)]
public struct RawInputHeader
{
public RawInputDeviceType Type;
public int Size;
public IntPtr Device;
public IntPtr Param;
public static int RawInputHeaderSize = Marshal.SizeOf<RawInputHeader>();
}
public struct RawMouse
{
public RawMouseState Flags;
private short Buttons;
public RawInputMouseState ButtonFlags;
public short ButtonData;
public int RawButtons;
public int LastX;
public int LastY;
public int ExtraInformation;
public static readonly int Size = Marshal.SizeOf(typeof(RawMouse));
}
public struct RawKeyboard
{
public short MakeCode;
public RawInputKeyboardFlags Flags;
private readonly short Reserved;
public VirtualKeys VirtualKey;
public WindowMessage Message;
public int ExtraInformation;
public static readonly int Size = Marshal.SizeOf(typeof(RawKeyboard));
}
[DllImport("User32", SetLastError = true)]
public static extern int GetRawInputData(
IntPtr rawInput, RawInputDataType command,
[Out] out RawInput data, [In, Out] ref int size, int sizeHeader);
[DllImport("User32", SetLastError = true)]
public static extern int GetRawInputData(
IntPtr rawInput, RawInputDataType command,
IntPtr data, [In, Out] ref int size, int sizeHeader);
我的第一個問題是,是佈局確定爲32位和64位?
現在,我嘗試讓原始HID數據:
int size = 0;
Win32API.GetRawInputData(
message.LParam,
Win32API.RawInputDataType.Header,
IntPtr.Zero, ref size,
Win32API.RawInputHeader.RawInputHeaderSize);
Win32API.RawInput ri;
Win32API.GetRawInputData(
message.LParam,
Win32API.RawInputDataType.Input,
out ri,
ref size,
Win32API.RawInputHeader.RawInputHeaderSize);
現在,我嘗試讓字節數組:
byte[] bytes = new byte[ri.Data.HID.Count];
Marshal.Copy(ri.Data.HID.Data, bytes, 0, ri.Data.HID.Count);
調試器只有幾步之遙了這兩條線。我認爲佈局是錯誤的,但林不知道。 HID結構的數量和大小始終爲零。
有誰知道錯誤在哪裏?
謝謝!
從不,*從不*,**從不**忽略winapi函數的返回值。如果你不檢查錯誤,那麼你不會找到一個錯誤。失敗時拋出一個Win32Exception。 –