sl@9: using System; sl@9: using System.Runtime.InteropServices; sl@9: sl@9: namespace Win32 sl@9: { sl@9: sl@9: static partial class Function sl@9: { sl@9: [DllImport("User32.dll", SetLastError = true)] sl@9: public extern static bool RegisterRawInputDevices(RAWINPUTDEVICE[] pRawInputDevice, uint uiNumDevices, uint cbSize); sl@9: sl@9: [DllImport("User32.dll", SetLastError = true)] sl@9: public extern static uint GetRawInputData(IntPtr hRawInput, uint uiCommand, IntPtr pData, ref uint pcbSize, uint cbSizeHeader); sl@9: sl@9: [DllImport("User32.dll", SetLastError=true)] sl@9: public extern static int GetRawInputDeviceInfo(IntPtr hDevice, uint uiCommand, IntPtr pData, ref uint pcbSize); sl@9: } sl@9: sl@9: static partial class Const sl@9: { sl@9: /// sl@9: /// GetRawInputDeviceInfo pData points to a string that contains the device name. sl@9: /// sl@9: public const uint RIDI_DEVICENAME = 0x20000007; sl@9: /// sl@9: /// GetRawInputDeviceInfo For this uiCommand only, the value in pcbSize is the character count (not the byte count). sl@9: /// sl@9: public const uint RIDI_DEVICEINFO = 0x2000000b; sl@9: /// sl@9: /// GetRawInputDeviceInfo pData points to an RID_DEVICE_INFO structure. sl@9: /// sl@9: public const uint RIDI_PREPARSEDDATA = 0x20000005; sl@9: sl@9: sl@9: /// sl@9: /// Data comes from a mouse. sl@9: /// sl@9: public const uint RIM_TYPEMOUSE = 0; sl@9: /// sl@9: /// Data comes from a keyboard. sl@9: /// sl@9: public const uint RIM_TYPEKEYBOARD = 1; sl@9: /// sl@9: /// Data comes from an HID that is not a keyboard or a mouse. sl@9: /// sl@9: public const uint RIM_TYPEHID = 2; sl@9: sl@10: public const int RID_INPUT = 0x10000003; sl@10: public const int RID_HEADER = 0x10000005; sl@10: sl@10: sl@9: } sl@9: sl@9: sl@9: [StructLayout(LayoutKind.Sequential, Pack = 1)] sl@9: internal struct RAWINPUTDEVICE sl@9: { sl@9: [MarshalAs(UnmanagedType.U2)] sl@9: public ushort usUsagePage; sl@9: [MarshalAs(UnmanagedType.U2)] sl@9: public ushort usUsage; sl@9: [MarshalAs(UnmanagedType.U4)] sl@9: public int dwFlags; sl@9: public IntPtr hwndTarget; sl@9: } sl@9: sl@9: sl@9: [StructLayout(LayoutKind.Sequential, Pack = 1)] sl@9: internal struct RAWINPUTHEADER sl@9: { sl@9: [MarshalAs(UnmanagedType.U4)] sl@9: public int dwType; sl@9: [MarshalAs(UnmanagedType.U4)] sl@9: public int dwSize; sl@9: public IntPtr hDevice; sl@9: [MarshalAs(UnmanagedType.U4)] sl@9: public int wParam; sl@9: } sl@9: sl@9: sl@9: [StructLayout(LayoutKind.Sequential, Pack = 1)] sl@9: internal struct RAWHID sl@9: { sl@9: [MarshalAs(UnmanagedType.U4)] sl@9: public int dwSizeHid; sl@9: [MarshalAs(UnmanagedType.U4)] sl@9: public int dwCount; sl@9: // sl@9: //BYTE bRawData[1]; sl@9: } sl@9: sl@9: sl@9: [StructLayout(LayoutKind.Sequential, Pack = 1)] sl@9: internal struct BUTTONSSTR sl@9: { sl@9: [MarshalAs(UnmanagedType.U2)] sl@9: public ushort usButtonFlags; sl@9: [MarshalAs(UnmanagedType.U2)] sl@9: public ushort usButtonData; sl@9: } sl@9: sl@9: sl@9: [StructLayout(LayoutKind.Explicit, Pack = 1)] sl@9: internal struct RAWMOUSE sl@9: { sl@9: [MarshalAs(UnmanagedType.U2)] sl@9: [FieldOffset(0)] sl@9: public ushort usFlags; sl@9: [MarshalAs(UnmanagedType.U4)] sl@9: [FieldOffset(4)] sl@9: public uint ulButtons; sl@9: [FieldOffset(4)] sl@9: public BUTTONSSTR buttonsStr; sl@9: [MarshalAs(UnmanagedType.U4)] sl@9: [FieldOffset(8)] sl@9: public uint ulRawButtons; sl@9: [MarshalAs(UnmanagedType.U4)] sl@9: [FieldOffset(12)] sl@9: public int lLastX; sl@9: [MarshalAs(UnmanagedType.U4)] sl@9: [FieldOffset(16)] sl@9: public int lLastY; sl@9: [MarshalAs(UnmanagedType.U4)] sl@9: [FieldOffset(20)] sl@9: public uint ulExtraInformation; sl@9: } sl@9: sl@9: [StructLayout(LayoutKind.Sequential, Pack = 1)] sl@9: internal struct RAWKEYBOARD sl@9: { sl@9: [MarshalAs(UnmanagedType.U2)] sl@9: public ushort MakeCode; sl@9: [MarshalAs(UnmanagedType.U2)] sl@9: public ushort Flags; sl@9: [MarshalAs(UnmanagedType.U2)] sl@9: public ushort Reserved; sl@9: [MarshalAs(UnmanagedType.U2)] sl@9: public ushort VKey; sl@9: [MarshalAs(UnmanagedType.U4)] sl@9: public uint Message; sl@9: [MarshalAs(UnmanagedType.U4)] sl@9: public uint ExtraInformation; sl@9: } sl@9: sl@9: sl@9: [StructLayout(LayoutKind.Explicit, Pack = 1)] sl@9: internal struct RAWINPUT sl@9: { sl@9: [FieldOffset(0)] sl@9: public RAWINPUTHEADER header; sl@9: [FieldOffset(16)] sl@9: public RAWMOUSE mouse; sl@9: [FieldOffset(16)] sl@9: public RAWKEYBOARD keyboard; sl@9: [FieldOffset(16)] sl@9: public RAWHID hid; sl@9: } sl@9: sl@9: sl@9: [StructLayout(LayoutKind.Sequential, Pack = 1)] sl@9: internal struct RID_DEVICE_INFO_MOUSE sl@9: { sl@9: public uint dwId; sl@9: public uint dwNumberOfButtons; sl@9: public uint dwSampleRate; sl@9: public bool fHasHorizontalWheel; sl@9: } sl@9: sl@9: sl@9: [StructLayout(LayoutKind.Sequential, Pack = 1)] sl@9: internal struct RID_DEVICE_INFO_KEYBOARD sl@9: { sl@9: public uint dwType; sl@9: public uint dwSubType; sl@9: public uint dwKeyboardMode; sl@9: public uint dwNumberOfFunctionKeys; sl@9: public uint dwNumberOfIndicators; sl@9: public uint dwNumberOfKeysTotal; sl@9: } sl@9: sl@9: [StructLayout(LayoutKind.Sequential, Pack = 1)] sl@9: internal struct RID_DEVICE_INFO_HID sl@9: { sl@9: public uint dwVendorId; sl@9: public uint dwProductId; sl@9: public uint dwVersionNumber; sl@9: public ushort usUsagePage; sl@9: public ushort usUsage; sl@9: } sl@9: sl@9: [StructLayout(LayoutKind.Explicit, Pack = 1)] sl@9: internal struct RID_DEVICE_INFO sl@9: { sl@9: [FieldOffset(0)] sl@9: public uint cbSize; sl@9: [FieldOffset(4)] sl@9: public uint dwType; sl@9: [FieldOffset(8)] sl@9: public RID_DEVICE_INFO_MOUSE mouse; sl@9: [FieldOffset(8)] sl@9: public RID_DEVICE_INFO_KEYBOARD keyboard; sl@9: [FieldOffset(8)] sl@9: public RID_DEVICE_INFO_HID hid; sl@9: } sl@9: sl@9: sl@9: }