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: }