Server/FormMain.Hid.cs
author StephaneLenclud
Fri, 19 Aug 2016 19:28:03 +0200
changeset 245 448e6a616c22
parent 241 3b5a94f31400
child 246 30a221eecc06
permissions -rw-r--r--
Removing Input tab as we don't need to specific features anymore.
     1 using System;
     2 using System.IO;
     3 using System.Collections.Generic;
     4 using System.Linq;
     5 using System.Text;
     6 using System.Threading.Tasks;
     7 using System.Diagnostics;
     8 using System.Runtime.InteropServices;
     9 using System.Windows.Forms;
    10 using Microsoft.Win32.SafeHandles;
    11 using System.ComponentModel;
    12 //
    13 using Hid = SharpLib.Hid;
    14 using SharpLib.Win32;
    15 
    16 namespace SharpDisplayManager
    17 {
    18     /// <summary>
    19     /// Implement handling of HID input reports notably to be able to launch an application using the Green Start button from IR remotes.
    20     /// </summary>
    21     [System.ComponentModel.DesignerCategory("Code")]
    22     public class FormMainHid : Form
    23     {
    24         //
    25         public delegate void OnHidEventDelegate(object aSender, Hid.Event aHidEvent);
    26 
    27         /// <summary>
    28         /// Use notably to handle green start key from IR remote control
    29         /// </summary>
    30         private Hid.Handler iHidHandler;
    31 
    32         /// <summary>
    33         /// Register HID devices so that we receive corresponding WM_INPUT messages.
    34         /// </summary>
    35         protected void RegisterHidDevices()
    36         {
    37             // Register the input device to receive the commands from the
    38             // remote device. See http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnwmt/html/remote_control.asp
    39             // for the vendor defined usage page.
    40 
    41             RAWINPUTDEVICE[] rid = new RAWINPUTDEVICE[6];
    42 
    43             int i = 0;
    44             rid[i].usUsagePage = (ushort)SharpLib.Hid.UsagePage.WindowsMediaCenterRemoteControl;
    45             rid[i].usUsage = (ushort)SharpLib.Hid.UsageCollection.WindowsMediaCenter.WindowsMediaCenterRemoteControl;
    46             rid[i].dwFlags = RawInputDeviceFlags.RIDEV_INPUTSINK;
    47             rid[i].hwndTarget = Handle;
    48 
    49             i++;
    50             rid[i].usUsagePage = (ushort)SharpLib.Hid.UsagePage.Consumer;
    51             rid[i].usUsage = (ushort)SharpLib.Hid.UsageCollection.Consumer.ConsumerControl;
    52             rid[i].dwFlags = RawInputDeviceFlags.RIDEV_INPUTSINK;
    53             rid[i].hwndTarget = Handle;
    54 
    55             i++;
    56             rid[i].usUsagePage = (ushort)SharpLib.Hid.UsagePage.Consumer;
    57             rid[i].usUsage = (ushort)SharpLib.Hid.UsageCollection.Consumer.Selection;
    58             rid[i].dwFlags = RawInputDeviceFlags.RIDEV_INPUTSINK;
    59             rid[i].hwndTarget = Handle;
    60 
    61             i++;
    62             rid[i].usUsagePage = (ushort)SharpLib.Hid.UsagePage.GenericDesktopControls;
    63             rid[i].usUsage = (ushort)SharpLib.Hid.UsageCollection.GenericDesktop.SystemControl;
    64             rid[i].dwFlags = RawInputDeviceFlags.RIDEV_INPUTSINK;
    65             rid[i].hwndTarget = Handle;
    66 
    67             i++;
    68             rid[i].usUsagePage = (ushort)SharpLib.Hid.UsagePage.GenericDesktopControls;
    69             rid[i].usUsage = (ushort)SharpLib.Hid.UsageCollection.GenericDesktop.GamePad;
    70             rid[i].dwFlags = RawInputDeviceFlags.RIDEV_INPUTSINK;
    71             rid[i].hwndTarget = Handle;
    72 
    73             i++;
    74             rid[i].usUsagePage = (ushort)SharpLib.Hid.UsagePage.GenericDesktopControls;
    75             rid[i].usUsage = (ushort)SharpLib.Hid.UsageCollection.GenericDesktop.Keyboard;
    76             rid[i].dwFlags = RawInputDeviceFlags.RIDEV_INPUTSINK;
    77             rid[i].hwndTarget = Handle;
    78 
    79             //i++;
    80             //rid[i].usUsagePage = (ushort)SharpLib.Hid.UsagePage.GenericDesktopControls;
    81             //rid[i].usUsage = (ushort)SharpLib.Hid.UsageCollection.GenericDesktop.Keyboard;
    82             //rid[i].dwFlags = Const.RIDEV_EXINPUTSINK;
    83             //rid[i].hwndTarget = Handle;
    84 
    85             //i++;
    86             //rid[i].usUsagePage = (ushort)Hid.UsagePage.GenericDesktopControls;
    87             //rid[i].usUsage = (ushort)Hid.UsageCollection.GenericDesktop.Mouse;
    88             //rid[i].dwFlags = Const.RIDEV_EXINPUTSINK;
    89             //rid[i].hwndTarget = aHWND;
    90 
    91 
    92             iHidHandler = new SharpLib.Hid.Handler(rid);
    93             if (!iHidHandler.IsRegistered)
    94             {
    95                 Debug.WriteLine("Failed to register raw input devices: " + Marshal.GetLastWin32Error().ToString());
    96             }
    97             iHidHandler.OnHidEvent += HandleHidEventThreadSafe;
    98 
    99         }
   100 
   101 
   102 
   103 
   104         /// <summary>
   105         /// Here we receive HID events from our HID library.
   106         /// </summary>
   107         /// <param name="aSender"></param>
   108         /// <param name="aHidEvent"></param>
   109         public void HandleHidEventThreadSafe(object aSender, SharpLib.Hid.Event aHidEvent)
   110         {
   111             if (aHidEvent.IsStray || !aHidEvent.IsValid)
   112             {
   113                 //Stray event just ignore it
   114                 return;
   115             }
   116 
   117             if (this.InvokeRequired)
   118             {
   119                 //Not in the proper thread, invoke ourselves
   120                 OnHidEventDelegate d = new OnHidEventDelegate(HandleHidEventThreadSafe);
   121                 this.Invoke(d, new object[] { aSender, aHidEvent });
   122             }
   123             else
   124             {
   125                 if (aHidEvent.IsGeneric)
   126                 {
   127                     if (aHidEvent.Usages.Count == 0)
   128                     {
   129                         //No usage, nothing to do then
   130                         return;
   131                     }
   132 
   133                     //We are in the proper thread
   134                     if (aHidEvent.UsagePage == (ushort) Hid.UsagePage.WindowsMediaCenterRemoteControl)
   135                     {
   136                         //Trigger events as needed
   137                         EventHidWindowsMediaCenter e = new EventHidWindowsMediaCenter
   138                         {
   139                             Usage = (Hid.Usage.WindowsMediaCenterRemoteControl) aHidEvent.Usages[0]
   140                         };
   141                         Properties.Settings.Default.EarManager.TriggerEvent(e);
   142                     }
   143                     else if (aHidEvent.UsagePage == (ushort) Hid.UsagePage.Consumer)
   144                     {
   145                         //Trigger matching events if any
   146                         EventHidConsumerControl e = new EventHidConsumerControl
   147                         {
   148                             Usage = (Hid.Usage.ConsumerControl) aHidEvent.Usages[0]
   149                         };
   150                         Properties.Settings.Default.EarManager.TriggerEvent(e);
   151                     }
   152                 }
   153                 else if (aHidEvent.IsKeyboard)
   154                 {
   155                     //Trigger matching events if any
   156                     EventHidKeyboard e = new EventHidKeyboard
   157                     {
   158                         Key = aHidEvent.VirtualKey,
   159                         IsKeyUp = aHidEvent.IsButtonUp,
   160                         HasModifierAlt = aHidEvent.HasModifierAlt,
   161                         HasModifierControl = aHidEvent.HasModifierControl,
   162                         HasModifierShift = aHidEvent.HasModifierShift,
   163                         HasModifierWindows = aHidEvent.HasModifierWindows,
   164                     };
   165                     Properties.Settings.Default.EarManager.TriggerEvent(e);
   166                 }                
   167 
   168             }
   169         }
   170 
   171     
   172 
   173     
   174 
   175 
   176         /// <summary>
   177         /// We need to handle WM_INPUT.
   178         /// </summary>
   179         /// <param name="message"></param>
   180         protected override void WndProc(ref Message message)
   181         {
   182             switch (message.Msg)
   183             {
   184                 case Const.WM_INPUT:
   185                     //Returning zero means we processed that message.
   186                     message.Result = new IntPtr(0);
   187                     iHidHandler.ProcessInput(ref message);
   188                     break;
   189             }
   190 
   191             //Pass this on to base class.
   192             base.WndProc(ref message);
   193         }
   194     }
   195 }