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。 –