Removing legacy remote control stuff.
authorStephaneLenclud
Sun, 15 Mar 2015 16:56:31 +0100
changeset 7872885c950813
parent 77 fb9ea5ad8c2d
child 79 cdc5f8f1b79e
Removing legacy remote control stuff.
HidDemo.csproj
HidHandler.cs
MainForm.Designer.cs
MainForm.cs
RemoteControlDevice.cs
     1.1 --- a/HidDemo.csproj	Sun Mar 15 14:45:40 2015 +0100
     1.2 +++ b/HidDemo.csproj	Sun Mar 15 16:56:31 2015 +0100
     1.3 @@ -130,9 +130,6 @@
     1.4      <Compile Include="MainForm.Designer.cs">
     1.5        <DependentUpon>MainForm.cs</DependentUpon>
     1.6      </Compile>
     1.7 -    <Compile Include="RemoteControlDevice.cs">
     1.8 -      <SubType>Code</SubType>
     1.9 -    </Compile>
    1.10      <Content Include="App.ico" />
    1.11    </ItemGroup>
    1.12    <ItemGroup>
     2.1 --- a/HidHandler.cs	Sun Mar 15 14:45:40 2015 +0100
     2.2 +++ b/HidHandler.cs	Sun Mar 15 16:56:31 2015 +0100
     2.3 @@ -48,8 +48,18 @@
     2.4              IsRegistered = Function.RegisterRawInputDevices(aRawInputDevices, (uint)aRawInputDevices.Length, (uint)Marshal.SizeOf(aRawInputDevices[0]));
     2.5          }
     2.6  
     2.7 -        public void ProcessInput(Message aMessage)
     2.8 +        /// <summary>
     2.9 +        /// Process a WM_INPUT message.
    2.10 +        /// </summary>
    2.11 +        /// <param name="aMessage"></param>
    2.12 +        public void ProcessInput(ref Message aMessage)
    2.13          {
    2.14 +            if (aMessage.Msg != Const.WM_INPUT)
    2.15 +            {
    2.16 +                //We only process WM_INPUT messages
    2.17 +                return;
    2.18 +            }
    2.19 +
    2.20              HidEvent hidEvent = new HidEvent(aMessage, OnHidEventRepeat);
    2.21              hidEvent.DebugWrite();
    2.22  
     3.1 --- a/MainForm.Designer.cs	Sun Mar 15 14:45:40 2015 +0100
     3.2 +++ b/MainForm.Designer.cs	Sun Mar 15 16:56:31 2015 +0100
     3.3 @@ -21,7 +21,7 @@
     3.4  using System.Collections.Generic;
     3.5  using System.Text;
     3.6  
     3.7 -namespace RemoteControlSample
     3.8 +namespace HidDemo
     3.9  {
    3.10      public partial class MainForm
    3.11      {
    3.12 @@ -32,8 +32,6 @@
    3.13          /// </summary>
    3.14          private void InitializeComponent()
    3.15          {
    3.16 -            this.labelButtonName = new System.Windows.Forms.Label();
    3.17 -            this.labelDeviceName = new System.Windows.Forms.Label();
    3.18              this.buttonClear = new System.Windows.Forms.Button();
    3.19              this.tabControl = new System.Windows.Forms.TabControl();
    3.20              this.tabPageMessages = new System.Windows.Forms.TabPage();
    3.21 @@ -60,26 +58,6 @@
    3.22              this.statusStrip.SuspendLayout();
    3.23              this.SuspendLayout();
    3.24              // 
    3.25 -            // labelButtonName
    3.26 -            // 
    3.27 -            this.labelButtonName.AutoSize = true;
    3.28 -            this.labelButtonName.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
    3.29 -            this.labelButtonName.Location = new System.Drawing.Point(785, 53);
    3.30 -            this.labelButtonName.Name = "labelButtonName";
    3.31 -            this.labelButtonName.Size = new System.Drawing.Size(103, 20);
    3.32 -            this.labelButtonName.TabIndex = 0;
    3.33 -            this.labelButtonName.Text = "Button Name";
    3.34 -            // 
    3.35 -            // labelDeviceName
    3.36 -            // 
    3.37 -            this.labelDeviceName.AutoSize = true;
    3.38 -            this.labelDeviceName.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
    3.39 -            this.labelDeviceName.Location = new System.Drawing.Point(785, 33);
    3.40 -            this.labelDeviceName.Name = "labelDeviceName";
    3.41 -            this.labelDeviceName.Size = new System.Drawing.Size(103, 20);
    3.42 -            this.labelDeviceName.TabIndex = 1;
    3.43 -            this.labelDeviceName.Text = "Device Name";
    3.44 -            // 
    3.45              // buttonClear
    3.46              // 
    3.47              this.buttonClear.Location = new System.Drawing.Point(813, 6);
    3.48 @@ -107,8 +85,6 @@
    3.49              // 
    3.50              this.tabPageMessages.Controls.Add(this.listViewEvents);
    3.51              this.tabPageMessages.Controls.Add(this.buttonClear);
    3.52 -            this.tabPageMessages.Controls.Add(this.labelDeviceName);
    3.53 -            this.tabPageMessages.Controls.Add(this.labelButtonName);
    3.54              this.tabPageMessages.Location = new System.Drawing.Point(4, 22);
    3.55              this.tabPageMessages.Name = "tabPageMessages";
    3.56              this.tabPageMessages.Padding = new System.Windows.Forms.Padding(3);
    3.57 @@ -267,7 +243,6 @@
    3.58              this.Load += new System.EventHandler(this.MainForm_Load);
    3.59              this.tabControl.ResumeLayout(false);
    3.60              this.tabPageMessages.ResumeLayout(false);
    3.61 -            this.tabPageMessages.PerformLayout();
    3.62              this.tabPageDevices.ResumeLayout(false);
    3.63              this.tabPageTests.ResumeLayout(false);
    3.64              this.tabPageTests.PerformLayout();
    3.65 @@ -279,6 +254,18 @@
    3.66          }
    3.67          #endregion Windows Form Designer generated code
    3.68  
    3.69 +        private System.Windows.Forms.Button buttonClear;
    3.70 +        private System.Windows.Forms.TabControl tabControl;
    3.71 +        private System.Windows.Forms.TabPage tabPageMessages;
    3.72 +        private System.Windows.Forms.ListView listViewEvents;
    3.73 +        private System.Windows.Forms.ColumnHeader columnHeaderUsages;
    3.74 +        private System.Windows.Forms.ColumnHeader columnHeaderInputReport;
    3.75 +        private System.Windows.Forms.ColumnHeader columnHeaderUsagePage;
    3.76 +        private System.Windows.Forms.ColumnHeader columnHeaderUsageCollection;
    3.77 +        private System.Windows.Forms.ColumnHeader columnHeaderRepeat;
    3.78 +        private System.Windows.Forms.ColumnHeader columnHeaderTime;
    3.79 +        private System.Windows.Forms.TabPage tabPageDevices;
    3.80 +        private System.Windows.Forms.TreeView treeViewDevices;
    3.81          private System.Windows.Forms.Button buttonTreeViewExpandAll;
    3.82          private System.Windows.Forms.Button buttonTreeViewCollapseAll;
    3.83          private System.Windows.Forms.StatusStrip statusStrip;
     4.1 --- a/MainForm.cs	Sun Mar 15 14:45:40 2015 +0100
     4.2 +++ b/MainForm.cs	Sun Mar 15 16:56:31 2015 +0100
     4.3 @@ -23,64 +23,26 @@
     4.4  using System.ComponentModel;
     4.5  using System.Windows.Forms;
     4.6  using System.Data;
     4.7 -using Devices.RemoteControl;
     4.8 +using System.Diagnostics;
     4.9 +using System.Runtime.InteropServices;
    4.10 +using SharpLib.Hid;
    4.11 +using SharpLib.Win32;
    4.12  
    4.13 -namespace RemoteControlSample
    4.14 +namespace HidDemo
    4.15  {
    4.16  	/// <summary>
    4.17  	/// Summary description for Form1.
    4.18  	/// </summary>
    4.19  	public partial class MainForm : System.Windows.Forms.Form
    4.20  	{
    4.21 -		/// <summary>
    4.22 -		/// Required designer variable.
    4.23 -		/// </summary>
    4.24 -        private System.ComponentModel.Container components = null;
    4.25 -        private RemoteControlDevice _remote;
    4.26 -        private Label labelButtonName;
    4.27 -        private Label labelDeviceName;
    4.28 -        private Button buttonClear;
    4.29 -        private TabControl tabControl;
    4.30 -        private TabPage tabPageMessages;
    4.31 -        private ListView listViewEvents;
    4.32 -        private ColumnHeader columnHeaderUsages;
    4.33 -        private ColumnHeader columnHeaderInputReport;
    4.34 -        private ColumnHeader columnHeaderUsagePage;
    4.35 -        private ColumnHeader columnHeaderUsageCollection;
    4.36 -        private ColumnHeader columnHeaderRepeat;
    4.37 -        private ColumnHeader columnHeaderTime;
    4.38 -        private TabPage tabPageDevices;
    4.39 -        private TreeView treeViewDevices;
    4.40 -		private Timer _timer;
    4.41 +	    private HidHandler iHidHandler;
    4.42  
    4.43          public delegate void OnHidEventDelegate(object aSender, SharpLib.Hid.HidEvent aHidEvent);
    4.44  
    4.45  		public MainForm()
    4.46  		{
    4.47 -			//
    4.48  			// Required for Windows Form Designer support
    4.49 -			//
    4.50 -			InitializeComponent();
    4.51 -
    4.52 -			_timer = new Timer();
    4.53 -			_timer.Interval = 3000;
    4.54 -			_timer.Enabled = false;
    4.55 -			_timer.Tick +=new EventHandler(_timer_Tick);            
    4.56 -		}
    4.57 -
    4.58 -		/// <summary>
    4.59 -		/// Clean up any resources being used.
    4.60 -		/// </summary>
    4.61 -		protected override void Dispose( bool disposing )
    4.62 -		{
    4.63 -			if( disposing )
    4.64 -			{
    4.65 -				if (components != null)
    4.66 -				{
    4.67 -					components.Dispose();
    4.68 -				}
    4.69 -			}
    4.70 -			base.Dispose( disposing );
    4.71 +			InitializeComponent();           
    4.72  		}
    4.73  
    4.74  
    4.75 @@ -95,15 +57,70 @@
    4.76  		}
    4.77  
    4.78          private void MainForm_Load(object sender, System.EventArgs e)
    4.79 -		{
    4.80 -            _remote = new RemoteControlDevice(this.Handle);
    4.81 -            _remote.ButtonPressed += new Devices.RemoteControl.RemoteControlDevice.RemoteControlDeviceEventHandler(_remote_ButtonPressed);
    4.82 -            _remote.iHidHandler.OnHidEvent += HandleHidEventThreadSafe;
    4.83 -            
    4.84 -            //
    4.85 +        {
    4.86 +            RegisterHidDevices();
    4.87 +            //Create our list of HID devices
    4.88              SharpLib.Win32.RawInput.PopulateDeviceList(treeViewDevices);
    4.89 +		}
    4.90  
    4.91 -		}
    4.92 +	    void RegisterHidDevices()
    4.93 +	    {           
    4.94 +            // Register the input device to receive the commands from the
    4.95 +            // remote device. See http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnwmt/html/remote_control.asp
    4.96 +            // for the vendor defined usage page.
    4.97 +
    4.98 +            RAWINPUTDEVICE[] rid = new RAWINPUTDEVICE[6];
    4.99 +
   4.100 +            int i = 0;
   4.101 +            rid[i].usUsagePage = (ushort)SharpLib.Hid.UsagePage.WindowsMediaCenterRemoteControl;
   4.102 +            rid[i].usUsage = (ushort)SharpLib.Hid.UsageCollection.WindowsMediaCenter.WindowsMediaCenterRemoteControl;
   4.103 +            rid[i].dwFlags = Const.RIDEV_EXINPUTSINK;
   4.104 +            rid[i].hwndTarget = Handle;
   4.105 +
   4.106 +            i++;
   4.107 +            rid[i].usUsagePage = (ushort)SharpLib.Hid.UsagePage.Consumer;
   4.108 +            rid[i].usUsage = (ushort)SharpLib.Hid.UsageCollection.Consumer.ConsumerControl;
   4.109 +            rid[i].dwFlags = Const.RIDEV_EXINPUTSINK;
   4.110 +            rid[i].hwndTarget = Handle;
   4.111 +
   4.112 +            i++;
   4.113 +            rid[i].usUsagePage = (ushort)SharpLib.Hid.UsagePage.Consumer;
   4.114 +            rid[i].usUsage = (ushort)SharpLib.Hid.UsageCollection.Consumer.Selection;
   4.115 +            rid[i].dwFlags = Const.RIDEV_EXINPUTSINK;
   4.116 +            rid[i].hwndTarget = Handle;
   4.117 +
   4.118 +            i++;
   4.119 +            rid[i].usUsagePage = (ushort)SharpLib.Hid.UsagePage.GenericDesktopControls;
   4.120 +            rid[i].usUsage = (ushort)SharpLib.Hid.UsageCollection.GenericDesktop.SystemControl;
   4.121 +            rid[i].dwFlags = Const.RIDEV_EXINPUTSINK;
   4.122 +            rid[i].hwndTarget = Handle;
   4.123 +
   4.124 +            i++;
   4.125 +            rid[i].usUsagePage = (ushort)SharpLib.Hid.UsagePage.GenericDesktopControls;
   4.126 +            rid[i].usUsage = (ushort)SharpLib.Hid.UsageCollection.GenericDesktop.GamePad;
   4.127 +            rid[i].dwFlags = Const.RIDEV_EXINPUTSINK;
   4.128 +            rid[i].hwndTarget = Handle;
   4.129 +
   4.130 +            i++;
   4.131 +            rid[i].usUsagePage = (ushort)SharpLib.Hid.UsagePage.GenericDesktopControls;
   4.132 +            rid[i].usUsage = (ushort)SharpLib.Hid.UsageCollection.GenericDesktop.Keyboard;
   4.133 +            //rid[i].dwFlags = Const.RIDEV_EXINPUTSINK;
   4.134 +            rid[i].hwndTarget = Handle;
   4.135 +
   4.136 +            //i++;
   4.137 +            //rid[i].usUsagePage = (ushort)Hid.UsagePage.GenericDesktopControls;
   4.138 +            //rid[i].usUsage = (ushort)Hid.UsageCollection.GenericDesktop.Mouse;
   4.139 +            //rid[i].dwFlags = Const.RIDEV_EXINPUTSINK;
   4.140 +            //rid[i].hwndTarget = aHWND;
   4.141 +
   4.142 +
   4.143 +            iHidHandler = new SharpLib.Hid.HidHandler(rid);
   4.144 +            if (!iHidHandler.IsRegistered)
   4.145 +            {
   4.146 +                Debug.WriteLine("Failed to register raw input devices: " + Marshal.GetLastWin32Error().ToString());
   4.147 +            }
   4.148 +            iHidHandler.OnHidEvent += HandleHidEventThreadSafe;
   4.149 +	    }
   4.150  
   4.151          public void HandleHidEventThreadSafe(object aSender, SharpLib.Hid.HidEvent aHidEvent)
   4.152          {
   4.153 @@ -129,58 +146,21 @@
   4.154  
   4.155  		protected override void WndProc(ref Message message)
   4.156  		{
   4.157 -            if (_remote != null)
   4.158 +            switch (message.Msg)
   4.159              {
   4.160 -                _remote.ProcessMessage(message);
   4.161 +                case Const.WM_KEYDOWN:
   4.162 +                    //ProcessKeyDown(message.WParam);
   4.163 +                    break;
   4.164 +                case Const.WM_INPUT:
   4.165 +                    //Returning zero means we processed that message.
   4.166 +                    message.Result = new IntPtr(0);
   4.167 +                    iHidHandler.ProcessInput(ref message);
   4.168 +                    break;
   4.169              }
   4.170 +            //Is that needed? Check the docs.
   4.171  			base.WndProc(ref message);
   4.172  		}
   4.173  
   4.174 -		private bool _remote_ButtonPressed(object sender, RemoteControlEventArgs e)
   4.175 -		{
   4.176 -            //Set text from here was disabled because of threading issues
   4.177 -            //That whole thing should be removed anyway
   4.178 -            bool processed = false;
   4.179 -			_timer.Enabled = false;
   4.180 -            if (e.Button != RemoteControlButton.Unknown)
   4.181 -            {
   4.182 -                //labelButtonName.Text = e.Button.ToString();
   4.183 -                processed = true;
   4.184 -            }
   4.185 -            else if (e.MceButton != SharpLib.Hid.Usage.WindowsMediaCenterRemoteControl.Null)
   4.186 -            {
   4.187 -                //Display MCE button name
   4.188 -                //labelButtonName.Text = e.MceButton.ToString();
   4.189 -                //Check if this is an HP extension
   4.190 -                if (Enum.IsDefined(typeof(SharpLib.Hid.Usage.HpWindowsMediaCenterRemoteControl), (ushort)e.MceButton))
   4.191 -                {
   4.192 -                    //Also display HP button name
   4.193 -                    //labelButtonName.Text += " / HP:" + ((Hid.UsageTables.HpWindowsMediaCenterRemoteControl)e.MceButton).ToString();
   4.194 -                }
   4.195 -
   4.196 -                processed = true;                
   4.197 -            }
   4.198 -            else if (e.ConsumerControl != SharpLib.Hid.Usage.ConsumerControl.Null)
   4.199 -            {
   4.200 -                //Display consumer control name
   4.201 -                //labelButtonName.Text = e.ConsumerControl.ToString();
   4.202 -                processed = true;
   4.203 -            }
   4.204 -            else
   4.205 -            {
   4.206 -                //labelButtonName.Text = "Unknown";
   4.207 -            }
   4.208 -			//labelDeviceName.Text = e.Device.ToString();
   4.209 -			_timer.Enabled = true;
   4.210 -            return processed;
   4.211 -		}
   4.212 -
   4.213 -		private void _timer_Tick(object sender, EventArgs e)
   4.214 -		{
   4.215 -			_timer.Enabled = false;
   4.216 -			labelButtonName.Text = "Ready...";
   4.217 -		}
   4.218 -
   4.219  		private void buttonClear_Click(object sender, EventArgs e)
   4.220  		{
   4.221  			listViewEvents.Items.Clear();
     5.1 --- a/RemoteControlDevice.cs	Sun Mar 15 14:45:40 2015 +0100
     5.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
     5.3 @@ -1,445 +0,0 @@
     5.4 -//
     5.5 -// Copyright (C) 2014-2015 Stéphane Lenclud.
     5.6 -//
     5.7 -// This file is part of SharpLibHid.
     5.8 -//
     5.9 -// SharpDisplayManager is free software: you can redistribute it and/or modify
    5.10 -// it under the terms of the GNU General Public License as published by
    5.11 -// the Free Software Foundation, either version 3 of the License, or
    5.12 -// (at your option) any later version.
    5.13 -//
    5.14 -// SharpDisplayManager is distributed in the hope that it will be useful,
    5.15 -// but WITHOUT ANY WARRANTY; without even the implied warranty of
    5.16 -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    5.17 -// GNU General Public License for more details.
    5.18 -//
    5.19 -// You should have received a copy of the GNU General Public License
    5.20 -// along with SharpDisplayManager.  If not, see <http://www.gnu.org/licenses/>.
    5.21 -//
    5.22 -
    5.23 -using System;
    5.24 -using System.Windows.Forms;
    5.25 -using System.Runtime.InteropServices;
    5.26 -using System.Diagnostics;
    5.27 -using System.Text;
    5.28 -using Microsoft.Win32.SafeHandles;
    5.29 -
    5.30 -using SharpLib.Hid.Usage;
    5.31 -using SharpLib.Win32;
    5.32 -
    5.33 -
    5.34 -
    5.35 -namespace Devices.RemoteControl
    5.36 -{
    5.37 -
    5.38 -    public enum InputDevice
    5.39 -    {
    5.40 -        Key,
    5.41 -        Mouse,
    5.42 -        OEM
    5.43 -    }
    5.44 -
    5.45 -
    5.46 -    public enum RemoteControlButton
    5.47 -    {
    5.48 -        Clear,
    5.49 -        Down,
    5.50 -        Left,
    5.51 -        Digit0,
    5.52 -        Digit1,
    5.53 -        Digit2,
    5.54 -        Digit3,
    5.55 -        Digit4,
    5.56 -        Digit5,
    5.57 -        Digit6,
    5.58 -        Digit7,
    5.59 -        Digit8,
    5.60 -        Digit9,
    5.61 -        Enter,
    5.62 -        Right,
    5.63 -        Up,
    5.64 -
    5.65 -        Back,
    5.66 -        ChannelDown,
    5.67 -        ChannelUp,
    5.68 -        FastForward,
    5.69 -        VolumeMute,
    5.70 -        Pause,
    5.71 -        Play,
    5.72 -        PlayPause,
    5.73 -        Record,
    5.74 -        PreviousTrack,
    5.75 -        Rewind,
    5.76 -        NextTrack,
    5.77 -        Stop,
    5.78 -        VolumeDown,
    5.79 -        VolumeUp,
    5.80 -
    5.81 -        RecordedTV,
    5.82 -        Guide,
    5.83 -        LiveTV,
    5.84 -        MoreInfo,
    5.85 -        Print,
    5.86 -        DVDMenu,
    5.87 -        DVDAngle,
    5.88 -        DVDAudio,
    5.89 -        DVDSubtitle,
    5.90 -        MyMusic,
    5.91 -        MyPictures,
    5.92 -        MyVideos,
    5.93 -        MyTV,
    5.94 -        OEM1,
    5.95 -        OEM2,
    5.96 -        StandBy,
    5.97 -        TVJump,
    5.98 -
    5.99 -        Unknown
   5.100 -    }
   5.101 -
   5.102 -
   5.103 -    #region RemoteControlEventArgs
   5.104 -
   5.105 -    public class RemoteControlEventArgs : EventArgs
   5.106 -    {
   5.107 -        RemoteControlButton _rcb;
   5.108 -        InputDevice _device;
   5.109 -        WindowsMediaCenterRemoteControl iMceButton;
   5.110 -        ConsumerControl iConsumerControl;
   5.111 -
   5.112 -        public RemoteControlEventArgs(RemoteControlButton rcb, InputDevice device)
   5.113 -        {
   5.114 -            SetNullButtons();
   5.115 -            //
   5.116 -            _rcb = rcb;
   5.117 -            _device = device;
   5.118 -        }
   5.119 -
   5.120 -        public RemoteControlEventArgs(ConsumerControl aConsumerControl, InputDevice device)
   5.121 -        {
   5.122 -            SetNullButtons();
   5.123 -            //
   5.124 -            iConsumerControl = aConsumerControl;
   5.125 -            _device = device;
   5.126 -        }
   5.127 -
   5.128 -
   5.129 -        public RemoteControlEventArgs(WindowsMediaCenterRemoteControl mce, InputDevice device)
   5.130 -        {
   5.131 -            SetNullButtons();
   5.132 -            //
   5.133 -            iMceButton = mce;
   5.134 -            _device = device;
   5.135 -        }
   5.136 -
   5.137 -        private void SetNullButtons()
   5.138 -        {
   5.139 -            iConsumerControl = ConsumerControl.Null;
   5.140 -            iMceButton = WindowsMediaCenterRemoteControl.Null;
   5.141 -            _rcb = RemoteControlButton.Unknown;
   5.142 -        }
   5.143 -
   5.144 -        public RemoteControlEventArgs()
   5.145 -        {
   5.146 -            iMceButton = WindowsMediaCenterRemoteControl.Null;
   5.147 -            _rcb = RemoteControlButton.Unknown;
   5.148 -            _device = InputDevice.Key;
   5.149 -        }
   5.150 -
   5.151 -        public RemoteControlButton Button
   5.152 -        {
   5.153 -            get { return _rcb; }
   5.154 -            set { _rcb = value; }
   5.155 -        }
   5.156 -
   5.157 -        public WindowsMediaCenterRemoteControl MceButton
   5.158 -        {
   5.159 -            get { return iMceButton; }
   5.160 -            set { iMceButton = value; }
   5.161 -        }
   5.162 -
   5.163 -        public ConsumerControl ConsumerControl
   5.164 -        {
   5.165 -            get { return iConsumerControl; }
   5.166 -            set { iConsumerControl = value; }
   5.167 -        }
   5.168 -
   5.169 -        public InputDevice Device
   5.170 -        {
   5.171 -            get { return _device; }
   5.172 -            set { _device = value; }
   5.173 -        }
   5.174 -    }
   5.175 -
   5.176 -    #endregion RemoteControlEventArgs
   5.177 -
   5.178 -
   5.179 -    public sealed class RemoteControlDevice
   5.180 -    {
   5.181 -        public delegate bool RemoteControlDeviceEventHandler(object sender, RemoteControlEventArgs e);
   5.182 -        public event RemoteControlDeviceEventHandler ButtonPressed;
   5.183 -
   5.184 -        /// <summary>
   5.185 -        /// Return true if the usage was processed.
   5.186 -        /// </summary>
   5.187 -        /// <param name="aUsage"></param>
   5.188 -        /// <returns></returns>
   5.189 -        public delegate bool HidUsageHandler(ushort aUsage);
   5.190 -
   5.191 -        public SharpLib.Hid.HidHandler iHidHandler;
   5.192 -
   5.193 -
   5.194 -        //-------------------------------------------------------------
   5.195 -        // constructors
   5.196 -        //-------------------------------------------------------------
   5.197 -
   5.198 -        public RemoteControlDevice(IntPtr aHWND)
   5.199 -        {
   5.200 -            // Register the input device to receive the commands from the
   5.201 -            // remote device. See http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnwmt/html/remote_control.asp
   5.202 -            // for the vendor defined usage page.
   5.203 -
   5.204 -            RAWINPUTDEVICE[] rid = new RAWINPUTDEVICE[6];
   5.205 -
   5.206 -            int i = 0;
   5.207 -            rid[i].usUsagePage = (ushort)SharpLib.Hid.UsagePage.WindowsMediaCenterRemoteControl;
   5.208 -            rid[i].usUsage = (ushort)SharpLib.Hid.UsageCollection.WindowsMediaCenter.WindowsMediaCenterRemoteControl;
   5.209 -            rid[i].dwFlags = Const.RIDEV_EXINPUTSINK;
   5.210 -            rid[i].hwndTarget = aHWND;
   5.211 -
   5.212 -            i++;
   5.213 -            rid[i].usUsagePage = (ushort)SharpLib.Hid.UsagePage.Consumer;
   5.214 -            rid[i].usUsage = (ushort)SharpLib.Hid.UsageCollection.Consumer.ConsumerControl;
   5.215 -            rid[i].dwFlags = Const.RIDEV_EXINPUTSINK;
   5.216 -            rid[i].hwndTarget = aHWND;
   5.217 -
   5.218 -            i++;
   5.219 -            rid[i].usUsagePage = (ushort)SharpLib.Hid.UsagePage.Consumer;
   5.220 -            rid[i].usUsage = (ushort)SharpLib.Hid.UsageCollection.Consumer.Selection;
   5.221 -            rid[i].dwFlags = Const.RIDEV_EXINPUTSINK;
   5.222 -            rid[i].hwndTarget = aHWND;
   5.223 -
   5.224 -            i++;
   5.225 -            rid[i].usUsagePage = (ushort)SharpLib.Hid.UsagePage.GenericDesktopControls;
   5.226 -            rid[i].usUsage = (ushort)SharpLib.Hid.UsageCollection.GenericDesktop.SystemControl;
   5.227 -            rid[i].dwFlags = Const.RIDEV_EXINPUTSINK;
   5.228 -            rid[i].hwndTarget = aHWND;
   5.229 -
   5.230 -			i++;
   5.231 -			rid[i].usUsagePage = (ushort)SharpLib.Hid.UsagePage.GenericDesktopControls;
   5.232 -			rid[i].usUsage = (ushort)SharpLib.Hid.UsageCollection.GenericDesktop.GamePad;
   5.233 -			rid[i].dwFlags = Const.RIDEV_EXINPUTSINK;
   5.234 -			rid[i].hwndTarget = aHWND;
   5.235 -
   5.236 -            i++;
   5.237 -            rid[i].usUsagePage = (ushort)SharpLib.Hid.UsagePage.GenericDesktopControls;
   5.238 -            rid[i].usUsage = (ushort)SharpLib.Hid.UsageCollection.GenericDesktop.Keyboard;
   5.239 -            //rid[i].dwFlags = Const.RIDEV_EXINPUTSINK;
   5.240 -            rid[i].hwndTarget = aHWND;
   5.241 -
   5.242 -            //i++;
   5.243 -            //rid[i].usUsagePage = (ushort)Hid.UsagePage.GenericDesktopControls;
   5.244 -            //rid[i].usUsage = (ushort)Hid.UsageCollection.GenericDesktop.Mouse;
   5.245 -            //rid[i].dwFlags = Const.RIDEV_EXINPUTSINK;
   5.246 -            //rid[i].hwndTarget = aHWND;
   5.247 -
   5.248 -
   5.249 -            iHidHandler = new SharpLib.Hid.HidHandler(rid);
   5.250 -            if (!iHidHandler.IsRegistered)
   5.251 -            {
   5.252 -                Debug.WriteLine("Failed to register raw input devices: " + Marshal.GetLastWin32Error().ToString());
   5.253 -            }
   5.254 -            iHidHandler.OnHidEvent += HandleHidEvent;
   5.255 -        }
   5.256 -
   5.257 -
   5.258 -        //-------------------------------------------------------------
   5.259 -        // methods
   5.260 -        //-------------------------------------------------------------
   5.261 -
   5.262 -        public void ProcessMessage(Message message)
   5.263 -        {
   5.264 -            switch (message.Msg)
   5.265 -            {
   5.266 -                case Const.WM_KEYDOWN:
   5.267 -                    ProcessKeyDown(message.WParam);
   5.268 -                    break;
   5.269 -                case Const.WM_INPUT:
   5.270 -                    //Returning zero means we processed that message.
   5.271 -                    message.Result = new IntPtr(0);
   5.272 -                    ProcessInputCommand(ref message);
   5.273 -                    break;
   5.274 -            }
   5.275 -
   5.276 -        }
   5.277 -
   5.278 -
   5.279 -        //-------------------------------------------------------------
   5.280 -        // methods (helpers)
   5.281 -        //-------------------------------------------------------------
   5.282 -
   5.283 -        private void ProcessKeyDown(IntPtr wParam)
   5.284 -        {
   5.285 -            RemoteControlButton rcb = RemoteControlButton.Unknown;
   5.286 -
   5.287 -            switch (wParam.ToInt32())
   5.288 -            {
   5.289 -                case (int)Keys.Escape:
   5.290 -                    rcb = RemoteControlButton.Clear;
   5.291 -                    break;
   5.292 -                case (int)Keys.Up:
   5.293 -                    rcb = RemoteControlButton.Up;
   5.294 -                    break;
   5.295 -                case (int)Keys.Down:
   5.296 -                    rcb = RemoteControlButton.Down;
   5.297 -                    break;
   5.298 -                case (int)Keys.Left:
   5.299 -                    rcb = RemoteControlButton.Left;
   5.300 -                    break;
   5.301 -                case (int)Keys.Right:
   5.302 -                    rcb = RemoteControlButton.Right;
   5.303 -                    break;
   5.304 -                case (int)Keys.Enter:
   5.305 -                    rcb = RemoteControlButton.Enter;
   5.306 -                    break;
   5.307 -                case (int)Keys.D0:
   5.308 -                    rcb = RemoteControlButton.Digit0;
   5.309 -                    break;
   5.310 -                case (int)Keys.D1:
   5.311 -                    rcb = RemoteControlButton.Digit1;
   5.312 -                    break;
   5.313 -                case (int)Keys.D2:
   5.314 -                    rcb = RemoteControlButton.Digit2;
   5.315 -                    break;
   5.316 -                case (int)Keys.D3:
   5.317 -                    rcb = RemoteControlButton.Digit3;
   5.318 -                    break;
   5.319 -                case (int)Keys.D4:
   5.320 -                    rcb = RemoteControlButton.Digit4;
   5.321 -                    break;
   5.322 -                case (int)Keys.D5:
   5.323 -                    rcb = RemoteControlButton.Digit5;
   5.324 -                    break;
   5.325 -                case (int)Keys.D6:
   5.326 -                    rcb = RemoteControlButton.Digit6;
   5.327 -                    break;
   5.328 -                case (int)Keys.D7:
   5.329 -                    rcb = RemoteControlButton.Digit7;
   5.330 -                    break;
   5.331 -                case (int)Keys.D8:
   5.332 -                    rcb = RemoteControlButton.Digit8;
   5.333 -                    break;
   5.334 -                case (int)Keys.D9:
   5.335 -                    rcb = RemoteControlButton.Digit9;
   5.336 -                    break;
   5.337 -            }
   5.338 -
   5.339 -            if (this.ButtonPressed != null && rcb != RemoteControlButton.Unknown)
   5.340 -            {
   5.341 -                Debug.WriteLine("KeyDown: " + rcb.ToString());
   5.342 -                this.ButtonPressed(this, new RemoteControlEventArgs(rcb, InputDevice.Key));
   5.343 -            }
   5.344 -        }
   5.345 -
   5.346 -
   5.347 -        /// <summary>
   5.348 -        /// 
   5.349 -        /// </summary>
   5.350 -        /// <param name="aUsage"></param>
   5.351 -        private bool HidConsumerDeviceHandler(ushort aUsage)
   5.352 -        {
   5.353 -            if (aUsage == 0)
   5.354 -            {
   5.355 -                //Just skip those
   5.356 -                return false;
   5.357 -            }
   5.358 -
   5.359 -            if (Enum.IsDefined(typeof(ConsumerControl), aUsage) && aUsage != 0) //Our button is a known consumer control
   5.360 -            {
   5.361 -                if (this.ButtonPressed != null)
   5.362 -                {
   5.363 -                    return this.ButtonPressed(this, new RemoteControlEventArgs((ConsumerControl)aUsage, InputDevice.OEM));
   5.364 -                }
   5.365 -                return false;
   5.366 -            }
   5.367 -            else
   5.368 -            {
   5.369 -                Debug.WriteLine("Unknown Consumer Control!");
   5.370 -                return false;
   5.371 -            }
   5.372 -        }
   5.373 -
   5.374 -        /// <summary>
   5.375 -        /// 
   5.376 -        /// </summary>
   5.377 -        /// <param name="aUsage"></param>
   5.378 -        private bool HidMceRemoteHandler(ushort aUsage)
   5.379 -        {
   5.380 -            if (aUsage == 0)
   5.381 -            {
   5.382 -                //Just skip those
   5.383 -                return false;
   5.384 -            }
   5.385 -
   5.386 -
   5.387 -            if (Enum.IsDefined(typeof(WindowsMediaCenterRemoteControl), aUsage) && aUsage != 0) //Our button is a known MCE button
   5.388 -            {
   5.389 -                if (this.ButtonPressed != null)
   5.390 -                {
   5.391 -                    return this.ButtonPressed(this, new RemoteControlEventArgs((WindowsMediaCenterRemoteControl)aUsage, InputDevice.OEM));
   5.392 -                }
   5.393 -                return false;
   5.394 -            }
   5.395 -            else
   5.396 -            {
   5.397 -                Debug.WriteLine("Unknown MCE button!");
   5.398 -                return false;
   5.399 -            }
   5.400 -        }
   5.401 -
   5.402 -        /// <summary>
   5.403 -        /// 
   5.404 -        /// </summary>
   5.405 -        /// <param name="message"></param>
   5.406 -        private void ProcessInputCommand(ref Message message)
   5.407 -        {
   5.408 -            //We received a WM_INPUT message
   5.409 -            Debug.WriteLine("================WM_INPUT================");
   5.410 -
   5.411 -            iHidHandler.ProcessInput(message);
   5.412 -
   5.413 -        }
   5.414 -
   5.415 -        /// <summary>
   5.416 -        /// 
   5.417 -        /// </summary>
   5.418 -        /// <param name="aSender"></param>
   5.419 -        /// <param name="aHidEvent"></param>
   5.420 -        void HandleHidEvent(object aSender, SharpLib.Hid.HidEvent aHidEvent)
   5.421 -        {
   5.422 -            HidUsageHandler usagePageHandler = null;
   5.423 -
   5.424 -            //Check if this an MCE remote HID message
   5.425 -            if (aHidEvent.UsagePage == (ushort)SharpLib.Hid.UsagePage.WindowsMediaCenterRemoteControl && aHidEvent.UsageCollection == (ushort)SharpLib.Hid.UsageCollection.WindowsMediaCenter.WindowsMediaCenterRemoteControl)
   5.426 -            {
   5.427 -                usagePageHandler = HidMceRemoteHandler;
   5.428 -            }
   5.429 -            //Check if this is a consumer control HID message
   5.430 -            else if (aHidEvent.UsagePage == (ushort)SharpLib.Hid.UsagePage.Consumer && aHidEvent.UsageCollection == (ushort)SharpLib.Hid.UsageCollection.Consumer.ConsumerControl)
   5.431 -            {
   5.432 -                usagePageHandler = HidConsumerDeviceHandler;
   5.433 -            }
   5.434 -            //Unknown HID message
   5.435 -            else
   5.436 -            {
   5.437 -                Debug.WriteLine("Unknown HID message.");
   5.438 -                return;
   5.439 -            }
   5.440 -
   5.441 -            foreach (ushort usage in aHidEvent.Usages)
   5.442 -            {
   5.443 -                usagePageHandler(usage);
   5.444 -            }
   5.445 -        }
   5.446 -    }
   5.447 -}
   5.448 -