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