Fixing stray event issues.
authorsl
Wed, 24 Dec 2014 11:17:45 +0100
changeset 42219e9a418456
parent 41 dd603eba46ca
child 43 5c7f34c627b9
Fixing stray event issues.
HidEvent.cs
MainForm.cs
     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