2011-09-10 98 views
3

我有一臺遙控器用於通過USB連接的PC。它不需要驅動程序,但不支持某些多媒體鍵。我想知道是否有一種方法來讀取輸入數據,以便我可以自己處理事件?從USB PC遠程讀取輸入

編輯:我找到了一個名爲的USBlyzer這個軟件,它向我顯示了我需要的所有信息,並且能夠處理usb事件。問題是它是封閉的源

編輯:這是相同的問題:https://superuser.com/questions/179457/software-to-customise-this-usb-pc-remote-control但仍然沒有答案給我。我有這個遠程

+0

它是一個HID設備和行爲像一個鍵盤? – kenny

+0

是的,確切地說!!! – technology

+1

如果它像鍵盤一樣工作,您應該嘗試捕獲按鍵或按鍵並進行調試,並查看您從那些不工作的按鈕上接收到的輸入類型。如果您收到這只是因爲你想不工作...在你的應用程序的任何輸入,您可以在最終轉置到別的東西,但在其它應用程序...不知道,運氣好:) –

回答

3

我認爲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); 
     } 
    } 
} 
+0

請你提供一個例子 – technology

+0

@develroot添加例如 – Andrey

2

這些庫應該能夠處理任何你需要訪問/使用遠程:

至於處理具體事件/鍵等:

通常這些都只是虛擬鍵碼 - 爲正式名單見http://msdn.microsoft.com/en-us/library/dd375731%28v=VS.85%29.aspx

,你可以找到例如VK_VOLUME_UPVK_MEDIA_PLAY_PAUSEVK_ZOOM

大多數遠程轉換爲這些代碼爲com儘可能與現有軟件兼容..

這些代碼是在Windows ME(!)出來並仍在使用的當天推出的 - 至少當我檢查了Windows 2008 R2的註冊表時!

基本的Windows轉換某些VK *爲WM_APPCOMMAND消息與該應用程序聽某些代碼...

,如果你想映射從遠程一些特定的按鍵,這樣Windows自動啓動的/你的應用程式,例如它例如某些remots和郵件/瀏覽器等:

這片神奇的通過Windows資源管理器,其在Software\ Microsoft\ Windows\ CurrentVersion\ Explorer\ AppKey從註冊表中讀取的映射(通過協會或直接EXEC)發生 - HKLM或HKCU。

與舊有的聯繫,但因爲它似乎仍然有效信息:

+0

是的,我已經找到VK_MEDIA_STOP,我如何趕上這個活動?當按下多媒體鍵Form.OnKeyDown沒有解僱 – technology

+0

這就是爲什麼我上面包括圖書館......請檢查鏈接了。 .. – Yahia