读取输入从USB PC遥控器

本文关键字:PC 遥控器 USB 输入 读取 | 更新日期: 2023-09-27 18:08:05

我的电脑有一个遥控器,通过USB连接。它不需要驱动程序,但不支持某些多媒体密钥。我想知道是否有一种方法来读取输入数据,这样我就可以自己处理事件?

编辑:我发现了一个名为USBlyzer的软件,它向我展示了我需要的所有信息,并且能够处理usb事件。问题是它是闭源的

编辑:这里是相同的问题:https://superuser.com/questions/179457/software-to-customise-this-usb-pc-remote-control但仍然没有答案给我。我有这个remote

读取输入从USB PC遥控器

我认为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);
        }
    }
}

这些库应该能够处理您访问/使用Remote所需的任何内容:

  • https://github.com/mikeobrien/HidLibrary
  • http://www.usbhidnetclass.org/(商业)
  • http://www.codeproject.com/KB/cs/USB_HID.aspx
  • http://www.lvr.com/hidpage.htm
  • http://www.codeproject.com/KB/system/HIDAche.aspx?q=C%23 +和+ USB +藏+设备

对于处理特定事件/键等:

通常这些只是虚拟密钥代码-官方列表请参阅http://msdn.microsoft.com/en-us/library/dd375731%28v=VS.85%29.aspx

你会发现例如VK_VOLUME_UP VK_MEDIA_PLAY_PAUSE VK_ZOOM

大多数遥控器翻译成这些代码,以尽可能与现有软件兼容。

这些代码是在Windows ME(!)出来的时候引入的,现在还在使用——至少当我检查我的Windows 2008 R2的注册表时是这样的!


基本上Windows将某些VK*转换为WM_APPCOMMAND消息,并带有应用程序侦听的特定代码…
如果你想从你的远程映射一些特定的键,以便Windows自动启动一个/你的应用程序,就像它做的一样,例如与某些远程和邮件/浏览器等:

通过Windows资源管理器读取映射(通过关联或直接执行)从Software' Microsoft' Windows' CurrentVersion' Explorer' AppKey注册表- HKLM或HKCU。


有些链接是旧的,但似乎仍然有效的信息:
  • http://msdn.microsoft.com/en-us/windows/hardware/gg463446.aspx
  • http://msdn.microsoft.com/en-us/windows/hardware/gg462991
  • http://msdn.microsoft.com/en-us/windows/hardware/gg463372