C# 从USB PC远程读取输入

C# 从USB PC远程读取输入,c#,usb,C#,Usb,我的电脑有一个遥控器,通过USB连接。它不需要驱动程序,但不支持某些多媒体键。我想知道有没有一种方法可以读取输入数据,这样我就可以自己处理事件了 编辑:我发现了一个名为USBlyzer的软件,它向我显示了我需要的所有信息,并且能够处理usb事件。问题是它是封闭源代码 编辑:这是同样的问题:但对我来说仍然没有答案。我有这个遥控器,我想你需要的是RAW输入。调用RegisterRarWinputDevices(使用平台调用)订阅事件。然后覆盖主窗口的WndProc。并调用GetRawInputDat

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

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


编辑:这是同样的问题:但对我来说仍然没有答案。我有这个遥控器,我想你需要的是RAW输入。调用
RegisterRarWinputDevices
(使用平台调用)订阅事件。然后覆盖主窗口的
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);
        }
    }
}

这些库应该能够处理访问/使用远程服务器所需的任何内容:

  • (商业)
关于处理特定事件/按键等:

通常,这些只是虚拟键代码-有关官方列表,请参阅

例如,您可以在这里找到
VK\u音量向上
VK\u媒体播放暂停
VK\u缩放

大多数遥控器转换为这些代码,以便尽可能与现有软件兼容

这些代码是在Windows ME(!)问世并仍在使用的那一天引入的,至少在我检查Windows 2008 R2的注册表时是这样

基本上,Windows将某些VK*转换为带有应用程序侦听的特定代码的
WM_APPCOMMAND
消息…

如果您想从遥控器映射某个特定的密钥,以便Windows自动启动应用程序,例如使用某些远程操作和邮件/浏览器等:

这个神奇的过程是通过Windows资源管理器实现的,它从注册表中读取映射(通过关联或直接执行),地址为
Software\Microsoft\Windows\CurrentVersion\Explorer\AppKey
-HKLM或HKCU

一些带有旧但似乎仍然有效信息的链接:


它是一个HID设备,作用类似于键盘吗?如果它像键盘一样工作,你应该试着按下或按下键并调试,看看从那些不工作的按钮接收到什么类型的输入。如果您收到的任何输入根本无法按照您的要求工作。。。在您的应用程序中,您最终可以将其转置到其他应用程序中,但在其他应用程序中。。。不确定,祝你好运:)好吧。这适用于遥控器上的普通键,如back、pageup、pagedown和enter。但不适用于静音、播放、暂停、音量增大/减小……(您提到的那些(即音量增大等)也映射到VK代码…请参见下面的答案…您能提供一个示例吗?是的,我发现VK_媒体_停止,我如何捕捉此事件?当按多媒体键时,Form.OnKeyDown不触发