Как использовать GetRawInputData из C#? - PullRequest
0 голосов
/ 03 августа 2020

Я пытаюсь получить ввод с клавиатуры с помощью GetRawInputData и C#. Кажется, я не могу прочитать поля RAWINPUTDATA, независимо от того, что я использую для определения вызова.

Я пробовал это:

В ответ на сообщение WM_INPUT , Я пробую это ...

void ProcessRawInput(Message message)
{
    uint dwSize = 0;
    uint retval;

    User32.RAWINPUT rawInput;

    retval = User32.GetRawInputData(message.LParam, User32.RAWINPUT.RID_HEADER, out rawInput, ref dwSize, Marshal.SizeOf<User32.RAWINPUTHEADER>());

    if (rawInput.header.dwType == (int)User32.RIM_TYPE.RIM_TYPEKEYBOARD)
    {

    }
}

Кажется, некоторые данные читаются в структуре заголовка, но ничего в структуре RAWINPUTDATA.

Я пробовал что-то вроде:

    if (rawInput.header.dwType == (int)User32.RIM_TYPE.RIM_TYPEKEYBOARD)
    {
        // set dwSize = Marshal.SizeOf<User32.RAWINPUT>()
        retval = User32.GetRawInputData(message.LParam, User32.RAWINPUT.RID_INPUT, out rawInput, ref dwSize, Marshal.SizeOf<User32.RAWINPUTHEADER>()); 
    }

Но единственная разница, кажется, состоит в огромном значении, возвращенном как retval.

Кажется, я не могу найти полезный пример (в C#).

Мои определения и структуры выглядят так:

[DllImport("User32.dll", SetLastError = true)]
        internal static extern uint GetRawInputData(IntPtr hRawInput, uint uiCommand, out RAWINPUT pData, ref uint pcbSize, int cbSizeHeader);

     [StructLayout(LayoutKind.Sequential)]
    public struct RAWINPUT
    {
        public const int RID_INPUT = 0x10000003,
                         RID_HEADER = 0x10000005;
        public RAWINPUTHEADER header;
        public RAWINPUTDATA data;
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct RAWINPUTHEADER
    {
        public int dwType;
        public int dwSize;
        public IntPtr hDevice;
        public IntPtr wParam;
    }

    [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 RAWKEYBOARD
    {
        public ushort MakeCode;
        public ushort Flags;
        public ushort Reserved;
        public ushort VKey;
        public uint Message;
        public ulong ExtraInformation;
    }
...