Fixing stray event issues.
1.1 --- a/HidEvent.cs Tue Dec 23 23:05:23 2014 +0100
1.2 +++ b/HidEvent.cs Wed Dec 24 11:17:45 2014 +0100
1.3 @@ -17,13 +17,14 @@
1.4 public class HidEvent: IDisposable
1.5 {
1.6 public bool IsValid { get; private set; }
1.7 - public bool IsForeground { get; private set; }
1.8 + public bool IsForeground { get; private set; }
1.9 public bool IsBackground { get{return !IsForeground;} }
1.10 public bool IsMouse { get; private set; }
1.11 public bool IsKeyboard { get; private set; }
1.12 public bool IsGeneric { get; private set; }
1.13 public bool IsButtonDown { get { return Usages.Count == 1 && Usages[0] != 0; } }
1.14 public bool IsButtonUp { get { return Usages.Count == 1 && Usages[0] == 0; } }
1.15 + public bool IsRepeat { get; private set; }
1.16
1.17 public HidDevice Device { get; private set; }
1.18
1.19 @@ -36,6 +37,12 @@
1.20
1.21 private System.Timers.Timer Timer { get; set; }
1.22
1.23 + /// <summary>
1.24 + /// Tells whether this event has already been disposed of.
1.25 + /// </summary>
1.26 + public bool IsStray { get { return Timer == null; } }
1.27 +
1.28 +
1.29
1.30 public void Dispose()
1.31 {
1.32 @@ -50,6 +57,7 @@
1.33 /// <param name="hRawInputDevice">Device Handle as provided by RAWINPUTHEADER.hDevice, typically accessed as rawinput.header.hDevice</param>
1.34 public HidEvent(Message aMessage, HidEventRepeatDelegate aRepeatDelegate)
1.35 {
1.36 + IsRepeat = false;
1.37 IsValid = false;
1.38 IsKeyboard = false;
1.39 IsGeneric = false;
1.40 @@ -220,31 +228,6 @@
1.41 }
1.42 }
1.43
1.44 -
1.45 - public ListViewItem ListViewItem
1.46 - {
1.47 - get
1.48 - {
1.49 - //TODO: What to do with multiple usage
1.50 - string usage="";
1.51 - UsagePage usagePage=(UsagePage)UsagePage;
1.52 - switch (usagePage)
1.53 - {
1.54 - case Hid.UsagePage.Consumer:
1.55 - usage= ((Hid.UsageTables.ConsumerControl)Usages[0]).ToString();
1.56 - break;
1.57 -
1.58 - case Hid.UsagePage.WindowsMediaCenterRemoteControl:
1.59 - usage= ((Hid.UsageTables.WindowsMediaCenterRemoteControl)Usages[0]).ToString();
1.60 - break;
1.61 -
1.62 - }
1.63 -
1.64 - ListViewItem item = new ListViewItem(new[] { usage, UsagePage.ToString("X2"), UsageCollection.ToString("X2") });
1.65 - return item;
1.66 - }
1.67 - }
1.68 -
1.69 public void StartRepeatTimer(double aInterval)
1.70 {
1.71 if (Timer == null)
1.72 @@ -260,10 +243,37 @@
1.73
1.74 private void OnRepeatTimerElapsed(object sender, ElapsedEventArgs e, HidEvent aHidEvent)
1.75 {
1.76 + if (aHidEvent.IsStray)
1.77 + {
1.78 + //Skip events if canceled
1.79 + return;
1.80 + }
1.81 + aHidEvent.IsRepeat = true;
1.82 StartRepeatTimer(1000/(SystemInformation.KeyboardSpeed+2.5));
1.83 OnHidEventRepeat(aHidEvent);
1.84 }
1.85
1.86 + public ListViewItem ToListViewItem()
1.87 + {
1.88 + //TODO: What to do with multiple usage
1.89 + string usage = "";
1.90 + UsagePage usagePage = (UsagePage)UsagePage;
1.91 + switch (usagePage)
1.92 + {
1.93 + case Hid.UsagePage.Consumer:
1.94 + usage = ((Hid.UsageTables.ConsumerControl)Usages[0]).ToString();
1.95 + break;
1.96 +
1.97 + case Hid.UsagePage.WindowsMediaCenterRemoteControl:
1.98 + usage = ((Hid.UsageTables.WindowsMediaCenterRemoteControl)Usages[0]).ToString();
1.99 + break;
1.100 +
1.101 + }
1.102 +
1.103 + ListViewItem item = new ListViewItem(new[] { usage, UsagePage.ToString("X2"), UsageCollection.ToString("X2"), IsRepeat.ToString() });
1.104 + return item;
1.105 + }
1.106 +
1.107 }
1.108
1.109 }
1.110 \ No newline at end of file
2.1 --- a/MainForm.cs Tue Dec 23 23:05:23 2014 +0100
2.2 +++ b/MainForm.cs Wed Dec 24 11:17:45 2014 +0100
2.3 @@ -24,6 +24,7 @@
2.4 private ColumnHeader columnHeaderUsage;
2.5 private ColumnHeader columnHeaderUsagePage;
2.6 private ColumnHeader columnHeaderUsageCollection;
2.7 + private ColumnHeader columnHeaderRepeat;
2.8 private Timer _timer;
2.9
2.10 public delegate void OnHidEventDelegate(object aSender, Hid.HidEvent aHidEvent);
2.11 @@ -69,6 +70,7 @@
2.12 this.columnHeaderUsage = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
2.13 this.columnHeaderUsagePage = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
2.14 this.columnHeaderUsageCollection = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
2.15 + this.columnHeaderRepeat = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
2.16 this.SuspendLayout();
2.17 //
2.18 // labelButtonName
2.19 @@ -100,7 +102,8 @@
2.20 this.listViewEvents.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
2.21 this.columnHeaderUsage,
2.22 this.columnHeaderUsagePage,
2.23 - this.columnHeaderUsageCollection});
2.24 + this.columnHeaderUsageCollection,
2.25 + this.columnHeaderRepeat});
2.26 this.listViewEvents.GridLines = true;
2.27 this.listViewEvents.Location = new System.Drawing.Point(12, 12);
2.28 this.listViewEvents.Name = "listViewEvents";
2.29 @@ -124,6 +127,10 @@
2.30 this.columnHeaderUsageCollection.Text = "Usage Collection";
2.31 this.columnHeaderUsageCollection.Width = 120;
2.32 //
2.33 + // columnHeaderRepeat
2.34 + //
2.35 + this.columnHeaderRepeat.Text = "Repeat";
2.36 + //
2.37 // MainForm
2.38 //
2.39 this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
2.40 @@ -159,6 +166,12 @@
2.41
2.42 public void HandleHidEventThreadSafe(object aSender, Hid.HidEvent aHidEvent)
2.43 {
2.44 + if (aHidEvent.IsStray)
2.45 + {
2.46 + //Stray event just ignore it
2.47 + return;
2.48 + }
2.49 +
2.50 if (this.InvokeRequired)
2.51 {
2.52 //Not in the proper thread, invoke ourselves
2.53 @@ -168,7 +181,7 @@
2.54 else
2.55 {
2.56 //We are in the proper thread
2.57 - listViewEvents.Items.Insert(0, aHidEvent.ListViewItem);
2.58 + listViewEvents.Items.Insert(0, aHidEvent.ToListViewItem());
2.59 }
2.60 }
2.61