Чтение ввода с USB PC Remote - PullRequest
       0

Чтение ввода с USB PC Remote

3 голосов
/ 10 сентября 2011

У меня есть пульт для моего ПК, который подключается через USB. Это не требует драйверов, но некоторые мультимедийные клавиши не поддерживаются. И я хочу знать, есть ли метод для чтения входных данных, чтобы я мог обрабатывать события самостоятельно?

Редактировать: Я нашел программное обеспечение под названием USBlyzer , которое показывает мне всю необходимую информацию и способно обрабатывать события usb. проблема в том, что это закрытый источник

Редактировать: вот тот же вопрос: https://superuser.com/questions/179457/software-to-customise-this-usb-pc-remote-control, но мне все еще нет ответа. У меня есть этот пульт

Ответы [ 2 ]

3 голосов
/ 10 сентября 2011

Я думаю, что RawInput - это то, что вам нужно. Звоните RegisterRawInputDevices (используя платформу вызова), чтобы подписаться на события. Затем переопределите WndProc главного окна. И позвоните GetRawInputData, чтобы прочитать и проанализировать необработанные данные.

Пример:

using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace StackOverflow
{
    static class Program
    {
        static void Main()
        {
            Application.Run(new Form1());
        }
    }

    public static class KeyboardRawInput
    {
        public struct RawKeyboard
        {
            public int Type;
            public int Size;
            public IntPtr Device;
            public IntPtr WParam;

            public ushort MakeCode;
            public ushort Flags;
            public ushort Reserved;
            public ushort VKey;
            public uint Message;
            public uint ExtraInformation;

        }

        public struct RawInputDevice
        {
            public ushort Page;
            public ushort Usage;
            public int Flags;
            public IntPtr HWnd;
        }


        [DllImport("user32", SetLastError = true)]
        public static extern bool RegisterRawInputDevices(
            [MarshalAs(UnmanagedType.LPArray)] RawInputDevice[] devs,
            uint count,
            int structSize);

        [DllImport("user32")]
        public static extern uint GetRawInputData(
            IntPtr hrawInput,
            uint command,
            ref RawKeyboard data,
            ref uint size,
            int headerSize);
    }

    class Form1 : Form
    {
        protected override void OnLoad(EventArgs e)
        {
            try {
                KeyboardRawInput.RawInputDevice dev = new KeyboardRawInput.RawInputDevice();
                dev.Page = 1;
                dev.Usage = 6;
                dev.Flags = 0x00000100 /*RIDEV_INPUTSINK*/;
                dev.HWnd = this.Handle;

                bool result = KeyboardRawInput.RegisterRawInputDevices(new KeyboardRawInput.RawInputDevice[] { dev }, 1, Marshal.SizeOf(typeof(KeyboardRawInput.RawInputDevice)));
                if (!result)
                    throw new Exception(string.Format("LastError: 0x{0:x}", Marshal.GetLastWin32Error()));

            } catch (Exception ex) {
                MessageBox.Show(ex.Message, "Error registering RawInput");
            }

            base.OnLoad(e);
        }

        protected override void WndProc(ref Message m)
        {
            if (m.Msg == 0xFF) {
                KeyboardRawInput.RawKeyboard keyboard = new KeyboardRawInput.RawKeyboard();
                uint size = (uint)Marshal.SizeOf(keyboard);
                uint result = KeyboardRawInput.GetRawInputData(m.LParam, 0x10000003, ref keyboard, ref size, 4 + 4 + IntPtr.Size * 2);
                if (result != uint.MaxValue) {
                    string parse = string.Format("MakeCode: 0x{0:X}\r\nMessage: 0x{1:X}\r\nVKey: 0x{2:X}", keyboard.MakeCode, keyboard.Message, keyboard.VKey);
                    MessageBox.Show(parse);
                }
            }

            base.WndProc(ref m);
        }
    }
}
2 голосов
/ 11 сентября 2011

эти библиотеки должны иметь возможность обрабатывать все, что вам нужно для доступа / использования Remote:

Что касается обработки определенных событий / ключей и т.д .:

Обычно это просто виртуальные коды клавиш - официальный список см. http://msdn.microsoft.com/en-us/library/dd375731%28v=VS.85%29.aspx

Там вы найдете, например, VK_VOLUME_UP VK_MEDIA_PLAY_PAUSE VK_ZOOM

Most Remotesперевести на эти коды, чтобы они были как можно более совместимы с существующим программным обеспечением ..

Эти коды были введены еще в тот день, когда Windows ME (!) вышла и все еще используется - по крайней мере, когда я проверил реестрмоей Windows 2008 R2!

В основном Windows переводит определенные VK * в WM_APPCOMMAND сообщения с определенными кодами, которые приложения слушают ...

ЕСЛИ вы хотите сопоставить какой-то конкретный ключ с вашего пульта дистанционного управления, чтобы Windows автоматически запускала / ваше приложение, как это происходит, например, с некоторыми удаленными приложениями, Mail / Browser и т. Д .:

Эта магия происходит через Проводник Windows, который считывает сопоставление (либо по ассоциации, либо по прямому исполнению) из реестра по адресу Software\ Microsoft\ Windows\ CurrentVersion\ Explorer\ AppKey - либо HKLM, либо HKCU.

Некоторые ссылки со старыми, но как этоКажется, все еще действительная информация:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...