# HG changeset patch # User sl # Date 1419416265 -3600 # Node ID 219e9a4184563e0d3e51b993dd7d15067ee32b31 # Parent dd603eba46ca6c7dcd7949da8f6e402e6acae98f Fixing stray event issues. diff -r dd603eba46ca -r 219e9a418456 HidEvent.cs --- a/HidEvent.cs Tue Dec 23 23:05:23 2014 +0100 +++ b/HidEvent.cs Wed Dec 24 11:17:45 2014 +0100 @@ -17,13 +17,14 @@ public class HidEvent: IDisposable { public bool IsValid { get; private set; } - public bool IsForeground { get; private set; } + public bool IsForeground { get; private set; } public bool IsBackground { get{return !IsForeground;} } public bool IsMouse { get; private set; } public bool IsKeyboard { get; private set; } public bool IsGeneric { get; private set; } public bool IsButtonDown { get { return Usages.Count == 1 && Usages[0] != 0; } } public bool IsButtonUp { get { return Usages.Count == 1 && Usages[0] == 0; } } + public bool IsRepeat { get; private set; } public HidDevice Device { get; private set; } @@ -36,6 +37,12 @@ private System.Timers.Timer Timer { get; set; } + /// + /// Tells whether this event has already been disposed of. + /// + public bool IsStray { get { return Timer == null; } } + + public void Dispose() { @@ -50,6 +57,7 @@ /// Device Handle as provided by RAWINPUTHEADER.hDevice, typically accessed as rawinput.header.hDevice public HidEvent(Message aMessage, HidEventRepeatDelegate aRepeatDelegate) { + IsRepeat = false; IsValid = false; IsKeyboard = false; IsGeneric = false; @@ -220,31 +228,6 @@ } } - - public ListViewItem ListViewItem - { - get - { - //TODO: What to do with multiple usage - string usage=""; - UsagePage usagePage=(UsagePage)UsagePage; - switch (usagePage) - { - case Hid.UsagePage.Consumer: - usage= ((Hid.UsageTables.ConsumerControl)Usages[0]).ToString(); - break; - - case Hid.UsagePage.WindowsMediaCenterRemoteControl: - usage= ((Hid.UsageTables.WindowsMediaCenterRemoteControl)Usages[0]).ToString(); - break; - - } - - ListViewItem item = new ListViewItem(new[] { usage, UsagePage.ToString("X2"), UsageCollection.ToString("X2") }); - return item; - } - } - public void StartRepeatTimer(double aInterval) { if (Timer == null) @@ -260,10 +243,37 @@ private void OnRepeatTimerElapsed(object sender, ElapsedEventArgs e, HidEvent aHidEvent) { + if (aHidEvent.IsStray) + { + //Skip events if canceled + return; + } + aHidEvent.IsRepeat = true; StartRepeatTimer(1000/(SystemInformation.KeyboardSpeed+2.5)); OnHidEventRepeat(aHidEvent); } + public ListViewItem ToListViewItem() + { + //TODO: What to do with multiple usage + string usage = ""; + UsagePage usagePage = (UsagePage)UsagePage; + switch (usagePage) + { + case Hid.UsagePage.Consumer: + usage = ((Hid.UsageTables.ConsumerControl)Usages[0]).ToString(); + break; + + case Hid.UsagePage.WindowsMediaCenterRemoteControl: + usage = ((Hid.UsageTables.WindowsMediaCenterRemoteControl)Usages[0]).ToString(); + break; + + } + + ListViewItem item = new ListViewItem(new[] { usage, UsagePage.ToString("X2"), UsageCollection.ToString("X2"), IsRepeat.ToString() }); + return item; + } + } } \ No newline at end of file diff -r dd603eba46ca -r 219e9a418456 MainForm.cs --- a/MainForm.cs Tue Dec 23 23:05:23 2014 +0100 +++ b/MainForm.cs Wed Dec 24 11:17:45 2014 +0100 @@ -24,6 +24,7 @@ private ColumnHeader columnHeaderUsage; private ColumnHeader columnHeaderUsagePage; private ColumnHeader columnHeaderUsageCollection; + private ColumnHeader columnHeaderRepeat; private Timer _timer; public delegate void OnHidEventDelegate(object aSender, Hid.HidEvent aHidEvent); @@ -69,6 +70,7 @@ this.columnHeaderUsage = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.columnHeaderUsagePage = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.columnHeaderUsageCollection = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeaderRepeat = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.SuspendLayout(); // // labelButtonName @@ -100,7 +102,8 @@ this.listViewEvents.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { this.columnHeaderUsage, this.columnHeaderUsagePage, - this.columnHeaderUsageCollection}); + this.columnHeaderUsageCollection, + this.columnHeaderRepeat}); this.listViewEvents.GridLines = true; this.listViewEvents.Location = new System.Drawing.Point(12, 12); this.listViewEvents.Name = "listViewEvents"; @@ -124,6 +127,10 @@ this.columnHeaderUsageCollection.Text = "Usage Collection"; this.columnHeaderUsageCollection.Width = 120; // + // columnHeaderRepeat + // + this.columnHeaderRepeat.Text = "Repeat"; + // // MainForm // this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); @@ -159,6 +166,12 @@ public void HandleHidEventThreadSafe(object aSender, Hid.HidEvent aHidEvent) { + if (aHidEvent.IsStray) + { + //Stray event just ignore it + return; + } + if (this.InvokeRequired) { //Not in the proper thread, invoke ourselves @@ -168,7 +181,7 @@ else { //We are in the proper thread - listViewEvents.Items.Insert(0, aHidEvent.ListViewItem); + listViewEvents.Items.Insert(0, aHidEvent.ToListViewItem()); } }