HidHandler.cs
author sl
Wed, 24 Dec 2014 14:31:16 +0100
changeset 43 5c7f34c627b9
parent 40 b3e177062849
child 49 2ec781e51f36
permissions -rw-r--r--
Fixing repeat delay and speed computation.
     1 using System;
     2 using System.Windows.Forms;
     3 using System.Runtime.InteropServices;
     4 using System.Diagnostics;
     5 using System.Text;
     6 using Microsoft.Win32.SafeHandles;
     7 using Win32;
     8 using System.Collections.Generic;
     9 
    10 
    11 namespace Hid
    12 {
    13 
    14 
    15     /// <summary>
    16     /// Our HID handler manages raw input registrations, processes WM_INPUT messages and broadcasts HID events in return.
    17     /// </summary>
    18     public class HidHandler
    19     {
    20         public delegate void HidEventHandler(object aSender, HidEvent aHidEvent);
    21         public event HidEventHandler OnHidEvent;
    22         List<HidEvent> iHidEvents;
    23 
    24 
    25         public bool IsRegistered { get; private set; }
    26 
    27         public HidHandler(RAWINPUTDEVICE[] aRawInputDevices)
    28         {
    29             iHidEvents=new List<HidEvent>();
    30             IsRegistered = Function.RegisterRawInputDevices(aRawInputDevices, (uint)aRawInputDevices.Length, (uint)Marshal.SizeOf(aRawInputDevices[0]));
    31         }
    32 
    33         public void ProcessInput(Message aMessage)
    34         {
    35             Hid.HidEvent hidEvent = new Hid.HidEvent(aMessage, OnHidEventRepeat);
    36             hidEvent.DebugWrite();
    37 
    38             if (!hidEvent.IsValid || !hidEvent.IsGeneric)
    39             {
    40                 Debug.WriteLine("Skipping HID message.");
    41                 return;
    42             }
    43 
    44             //
    45             if (hidEvent.Usages[0] == 0)
    46             {
    47                 //This is a key up event
    48                 //We need to discard any events belonging to the same page and collection
    49                 for (int i = (iHidEvents.Count-1); i >= 0; i--)
    50                 {
    51                     if (iHidEvents[i].UsageId == hidEvent.UsageId)
    52                     {
    53                         iHidEvents[i].Dispose();
    54                         iHidEvents.RemoveAt(i);
    55                     }
    56                 }
    57             }
    58             else
    59             {
    60                 //Keep that event until we get a key up message
    61                 iHidEvents.Add(hidEvent);
    62             }
    63 
    64             //Broadcast our events
    65             OnHidEvent(this, hidEvent);    
    66         }
    67 
    68         public void OnHidEventRepeat(HidEvent aHidEvent)
    69         {
    70             //Broadcast our events
    71             OnHidEvent(this, aHidEvent);    
    72         }
    73 
    74     }
    75 
    76 }