// Let all observers know which keys are currently pressed
 // (after some activity happened).
 private void TriggerKeyActivityDetectedEvent(KeyActivity keyActivity)
 {
     EventHandler<KeyActivityEventArgs> temp = KeyActivityDetected;
      if (temp != null)
      {
     temp(this, new KeyActivityEventArgs(CurrentlyPressed, keyActivity));
      }
 }
 public KeyActivityEventArgs(IEnumerable<int> keys, KeyActivity keyActivity)
 {
     _keys = keys;
      _keyActivity = keyActivity;
 }
        /// <summary>
        /// Extracts the required key press information and triggers an event
        /// for KeyActivity.
        /// </summary>
        /// <returns>false if keyboard activity should be ignored,
        ///          true otherwise</returns>
        private bool ProcessKeyActivity(RAWKEYBOARD rawKeyboard)
        {
            ushort key = rawKeyboard.VirtualKey;

             // Skip the extra key messages for "extended keys"
             if (key >= EXTENDED_KEY_FLAG)
             {
            return false;
             }

             // Pack the correct left/right information into the key value for
             // modifier keys.
             FixModifierKeys(ref key, rawKeyboard.Flags, rawKeyboard.MakeCode);

             KeyActivity keyActivity = new KeyActivity(key, rawKeyboard.Message);

             // TODO: figure out which keyboard it came from??
             // http://www.codeproject.com/Articles/17123/
             // pass in some sort of id or whatnot into TriggerKeyActivity...
             // so that subscribers can distinguish keyboards

             // TODO: Handle the pause key better...
             if (rawKeyboard.Message == KEYINPUTTYPES.WM_KEYDOWN
             || rawKeyboard.Message == KEYINPUTTYPES.WM_SYSKEYDOWN)
             {
            // Only trigger activity for new keydown's
            if (CurrentlyPressed.Add(key))
            {
               History.Enqueue(key);
               TriggerKeyActivityDetectedEvent(keyActivity);
            }
             }
             else if (rawKeyboard.Message == KEYINPUTTYPES.WM_KEYUP
                  || rawKeyboard.Message == KEYINPUTTYPES.WM_SYSKEYUP)
             {
            CurrentlyPressed.Remove(key);

            // always trigger activity for keyup's
            TriggerKeyActivityDetectedEvent(keyActivity);
             }

             return true;
        }