MainForm.cs
author StephaneLenclud
Wed, 11 Feb 2015 19:46:21 +0100
changeset 49 2ec781e51f36
parent 44 63a5f4c05179
child 60 687cace560d2
permissions -rw-r--r--
Adding better support for multiple usage per report.
Now registering for gamepad input.
     1 using System;
     2 using System.Drawing;
     3 using System.Collections;
     4 using System.ComponentModel;
     5 using System.Windows.Forms;
     6 using System.Data;
     7 using Devices.RemoteControl;
     8 
     9 namespace RemoteControlSample
    10 {
    11 	/// <summary>
    12 	/// Summary description for Form1.
    13 	/// </summary>
    14 	public class MainForm : System.Windows.Forms.Form
    15 	{
    16 		/// <summary>
    17 		/// Required designer variable.
    18 		/// </summary>
    19         private System.ComponentModel.Container components = null;
    20         private RemoteControlDevice _remote;
    21         private Label labelButtonName;
    22         private Label labelDeviceName;
    23         private ListView listViewEvents;
    24         private ColumnHeader columnHeaderUsages;
    25         private ColumnHeader columnHeaderUsagePage;
    26         private ColumnHeader columnHeaderUsageCollection;
    27         private ColumnHeader columnHeaderRepeat;
    28         private ColumnHeader columnHeaderTime;
    29 		private Button buttonClear;
    30 		private ColumnHeader columnHeaderInputReport;
    31 		private Timer _timer;
    32 
    33         public delegate void OnHidEventDelegate(object aSender, Hid.HidEvent aHidEvent);
    34 
    35 		public MainForm()
    36 		{
    37 			//
    38 			// Required for Windows Form Designer support
    39 			//
    40 			InitializeComponent();
    41 
    42 			_timer = new Timer();
    43 			_timer.Interval = 3000;
    44 			_timer.Enabled = false;
    45 			_timer.Tick +=new EventHandler(_timer_Tick);            
    46 		}
    47 
    48 		/// <summary>
    49 		/// Clean up any resources being used.
    50 		/// </summary>
    51 		protected override void Dispose( bool disposing )
    52 		{
    53 			if( disposing )
    54 			{
    55 				if (components != null)
    56 				{
    57 					components.Dispose();
    58 				}
    59 			}
    60 			base.Dispose( disposing );
    61 		}
    62 
    63 		#region Windows Form Designer generated code
    64 		/// <summary>
    65 		/// Required method for Designer support - do not modify
    66 		/// the contents of this method with the code editor.
    67 		/// </summary>
    68 		private void InitializeComponent()
    69 		{
    70 			this.labelButtonName = new System.Windows.Forms.Label();
    71 			this.labelDeviceName = new System.Windows.Forms.Label();
    72 			this.listViewEvents = new System.Windows.Forms.ListView();
    73 			this.columnHeaderUsages = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
    74 			this.columnHeaderUsagePage = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
    75 			this.columnHeaderUsageCollection = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
    76 			this.columnHeaderRepeat = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
    77 			this.columnHeaderTime = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
    78 			this.buttonClear = new System.Windows.Forms.Button();
    79 			this.columnHeaderInputReport = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
    80 			this.SuspendLayout();
    81 			// 
    82 			// labelButtonName
    83 			// 
    84 			this.labelButtonName.AutoSize = true;
    85 			this.labelButtonName.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
    86 			this.labelButtonName.Location = new System.Drawing.Point(811, 55);
    87 			this.labelButtonName.Name = "labelButtonName";
    88 			this.labelButtonName.Size = new System.Drawing.Size(103, 20);
    89 			this.labelButtonName.TabIndex = 0;
    90 			this.labelButtonName.Text = "Button Name";
    91 			// 
    92 			// labelDeviceName
    93 			// 
    94 			this.labelDeviceName.AutoSize = true;
    95 			this.labelDeviceName.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
    96 			this.labelDeviceName.Location = new System.Drawing.Point(811, 35);
    97 			this.labelDeviceName.Name = "labelDeviceName";
    98 			this.labelDeviceName.Size = new System.Drawing.Size(103, 20);
    99 			this.labelDeviceName.TabIndex = 1;
   100 			this.labelDeviceName.Text = "Device Name";
   101 			// 
   102 			// listViewEvents
   103 			// 
   104 			this.listViewEvents.Alignment = System.Windows.Forms.ListViewAlignment.Left;
   105 			this.listViewEvents.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
   106             | System.Windows.Forms.AnchorStyles.Left)));
   107 			this.listViewEvents.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
   108 			this.listViewEvents.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
   109             this.columnHeaderUsages,
   110             this.columnHeaderInputReport,
   111             this.columnHeaderUsagePage,
   112             this.columnHeaderUsageCollection,
   113             this.columnHeaderRepeat,
   114             this.columnHeaderTime});
   115 			this.listViewEvents.GridLines = true;
   116 			this.listViewEvents.Location = new System.Drawing.Point(12, 12);
   117 			this.listViewEvents.Name = "listViewEvents";
   118 			this.listViewEvents.Size = new System.Drawing.Size(766, 369);
   119 			this.listViewEvents.TabIndex = 2;
   120 			this.listViewEvents.UseCompatibleStateImageBehavior = false;
   121 			this.listViewEvents.View = System.Windows.Forms.View.Details;
   122 			// 
   123 			// columnHeaderUsages
   124 			// 
   125 			this.columnHeaderUsages.Text = "Usages";
   126 			this.columnHeaderUsages.Width = 180;
   127 			// 
   128 			// columnHeaderUsagePage
   129 			// 
   130 			this.columnHeaderUsagePage.Text = "Usage Page";
   131 			this.columnHeaderUsagePage.Width = 87;
   132 			// 
   133 			// columnHeaderUsageCollection
   134 			// 
   135 			this.columnHeaderUsageCollection.Text = "Usage Collection";
   136 			this.columnHeaderUsageCollection.Width = 134;
   137 			// 
   138 			// columnHeaderRepeat
   139 			// 
   140 			this.columnHeaderRepeat.Text = "Repeat";
   141 			this.columnHeaderRepeat.Width = 68;
   142 			// 
   143 			// columnHeaderTime
   144 			// 
   145 			this.columnHeaderTime.Text = "Time";
   146 			this.columnHeaderTime.Width = 76;
   147 			// 
   148 			// buttonClear
   149 			// 
   150 			this.buttonClear.Location = new System.Drawing.Point(839, 9);
   151 			this.buttonClear.Name = "buttonClear";
   152 			this.buttonClear.Size = new System.Drawing.Size(75, 23);
   153 			this.buttonClear.TabIndex = 3;
   154 			this.buttonClear.Text = "Clear";
   155 			this.buttonClear.UseVisualStyleBackColor = true;
   156 			this.buttonClear.Click += new System.EventHandler(this.buttonClear_Click);
   157 			// 
   158 			// columnHeaderInputReport
   159 			// 
   160 			this.columnHeaderInputReport.Text = "Input Report";
   161 			this.columnHeaderInputReport.Width = 176;
   162 			// 
   163 			// MainForm
   164 			// 
   165 			this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
   166 			this.BackColor = System.Drawing.SystemColors.Control;
   167 			this.ClientSize = new System.Drawing.Size(926, 393);
   168 			this.Controls.Add(this.buttonClear);
   169 			this.Controls.Add(this.listViewEvents);
   170 			this.Controls.Add(this.labelDeviceName);
   171 			this.Controls.Add(this.labelButtonName);
   172 			this.Name = "MainForm";
   173 			this.Text = "Remote Control Sample";
   174 			this.Load += new System.EventHandler(this.Form1_Load);
   175 			this.ResumeLayout(false);
   176 			this.PerformLayout();
   177 
   178 		}
   179 		#endregion Windows Form Designer generated code
   180 
   181 		/// <summary>
   182 		/// The main entry point for the application.
   183 		/// </summary>
   184 		[STAThread]
   185 		static void Main()
   186 		{
   187 			Application.Run(new MainForm());
   188 		}
   189 
   190 		private void Form1_Load(object sender, System.EventArgs e)
   191 		{
   192             _remote = new RemoteControlDevice(this.Handle);
   193             _remote.ButtonPressed += new Devices.RemoteControl.RemoteControlDevice.RemoteControlDeviceEventHandler(_remote_ButtonPressed);
   194             _remote.iHidHandler.OnHidEvent += HandleHidEventThreadSafe;             
   195 		}
   196 
   197         public void HandleHidEventThreadSafe(object aSender, Hid.HidEvent aHidEvent)
   198         {
   199             if (aHidEvent.IsStray)
   200             {
   201                 //Stray event just ignore it
   202                 return;
   203             }
   204 
   205             if (this.InvokeRequired)
   206             {
   207                 //Not in the proper thread, invoke ourselves
   208                 OnHidEventDelegate d = new OnHidEventDelegate(HandleHidEventThreadSafe);
   209                 this.Invoke(d, new object[] { aSender, aHidEvent });
   210             }
   211             else
   212             {
   213                 //We are in the proper thread
   214                 listViewEvents.Items.Insert(0, aHidEvent.ToListViewItem());
   215             }
   216         }
   217 
   218 		protected override void WndProc(ref Message message)
   219 		{
   220             if (_remote != null)
   221             {
   222                 _remote.ProcessMessage(message);
   223             }
   224 			base.WndProc(ref message);
   225 		}
   226 
   227 		private bool _remote_ButtonPressed(object sender, RemoteControlEventArgs e)
   228 		{
   229             //Set text from here was disabled because of threading issues
   230             //That whole thing should be removed anyway
   231             bool processed = false;
   232 			_timer.Enabled = false;
   233             if (e.Button != RemoteControlButton.Unknown)
   234             {
   235                 //labelButtonName.Text = e.Button.ToString();
   236                 processed = true;
   237             }
   238             else if (e.MceButton != Hid.UsageTables.WindowsMediaCenterRemoteControl.Null)
   239             {
   240                 //Display MCE button name
   241                 //labelButtonName.Text = e.MceButton.ToString();
   242                 //Check if this is an HP extension
   243                 if (Enum.IsDefined(typeof(Hid.UsageTables.HpWindowsMediaCenterRemoteControl), (ushort)e.MceButton))
   244                 {
   245                     //Also display HP button name
   246                     //labelButtonName.Text += " / HP:" + ((Hid.UsageTables.HpWindowsMediaCenterRemoteControl)e.MceButton).ToString();
   247                 }
   248 
   249                 processed = true;                
   250             }
   251             else if (e.ConsumerControl != Hid.UsageTables.ConsumerControl.Null)
   252             {
   253                 //Display consumer control name
   254                 //labelButtonName.Text = e.ConsumerControl.ToString();
   255                 processed = true;
   256             }
   257             else
   258             {
   259                 //labelButtonName.Text = "Unknown";
   260             }
   261 			//labelDeviceName.Text = e.Device.ToString();
   262 			_timer.Enabled = true;
   263             return processed;
   264 		}
   265 
   266 		private void _timer_Tick(object sender, EventArgs e)
   267 		{
   268 			_timer.Enabled = false;
   269 			labelButtonName.Text = "Ready...";
   270 		}
   271 
   272 		private void buttonClear_Click(object sender, EventArgs e)
   273 		{
   274 			listViewEvents.Items.Clear();
   275 		}
   276 
   277 	}
   278 }