Removing Input tab as we don't need to specific features anymore.
3 using System.Collections.Generic;
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;
13 using Hid = SharpLib.Hid;
16 namespace SharpDisplayManager
19 /// Implement handling of HID input reports notably to be able to launch an application using the Green Start button from IR remotes.
21 [System.ComponentModel.DesignerCategory("Code")]
22 public class FormMainHid : Form
25 public delegate void OnHidEventDelegate(object aSender, Hid.Event aHidEvent);
28 /// Use notably to handle green start key from IR remote control
30 private Hid.Handler iHidHandler;
33 /// Register HID devices so that we receive corresponding WM_INPUT messages.
35 protected void RegisterHidDevices()
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.
41 RAWINPUTDEVICE[] rid = new RAWINPUTDEVICE[6];
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;
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;
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;
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;
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;
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;
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;
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;
92 iHidHandler = new SharpLib.Hid.Handler(rid);
93 if (!iHidHandler.IsRegistered)
95 Debug.WriteLine("Failed to register raw input devices: " + Marshal.GetLastWin32Error().ToString());
97 iHidHandler.OnHidEvent += HandleHidEventThreadSafe;
105 /// Here we receive HID events from our HID library.
107 /// <param name="aSender"></param>
108 /// <param name="aHidEvent"></param>
109 public void HandleHidEventThreadSafe(object aSender, SharpLib.Hid.Event aHidEvent)
111 if (aHidEvent.IsStray || !aHidEvent.IsValid)
113 //Stray event just ignore it
117 if (this.InvokeRequired)
119 //Not in the proper thread, invoke ourselves
120 OnHidEventDelegate d = new OnHidEventDelegate(HandleHidEventThreadSafe);
121 this.Invoke(d, new object[] { aSender, aHidEvent });
125 if (aHidEvent.IsGeneric)
127 if (aHidEvent.Usages.Count == 0)
129 //No usage, nothing to do then
133 //We are in the proper thread
134 if (aHidEvent.UsagePage == (ushort) Hid.UsagePage.WindowsMediaCenterRemoteControl)
136 //Trigger events as needed
137 EventHidWindowsMediaCenter e = new EventHidWindowsMediaCenter
139 Usage = (Hid.Usage.WindowsMediaCenterRemoteControl) aHidEvent.Usages[0]
141 Properties.Settings.Default.EarManager.TriggerEvent(e);
143 else if (aHidEvent.UsagePage == (ushort) Hid.UsagePage.Consumer)
145 //Trigger matching events if any
146 EventHidConsumerControl e = new EventHidConsumerControl
148 Usage = (Hid.Usage.ConsumerControl) aHidEvent.Usages[0]
150 Properties.Settings.Default.EarManager.TriggerEvent(e);
153 else if (aHidEvent.IsKeyboard)
155 //Trigger matching events if any
156 EventHidKeyboard e = new EventHidKeyboard
158 Key = aHidEvent.VirtualKey,
159 IsKeyUp = aHidEvent.IsButtonUp,
160 HasModifierAlt = aHidEvent.HasModifierAlt,
161 HasModifierControl = aHidEvent.HasModifierControl,
162 HasModifierShift = aHidEvent.HasModifierShift,
163 HasModifierWindows = aHidEvent.HasModifierWindows,
165 Properties.Settings.Default.EarManager.TriggerEvent(e);
177 /// We need to handle WM_INPUT.
179 /// <param name="message"></param>
180 protected override void WndProc(ref Message message)
185 //Returning zero means we processed that message.
186 message.Result = new IntPtr(0);
187 iHidHandler.ProcessInput(ref message);
191 //Pass this on to base class.
192 base.WndProc(ref message);