/// <summary>
        /// Removes the specified hot key.
        /// </summary>
        /// <param name="state">The hot key to remove.</param>
        /// <returns>true if the hot key was removed successfully; otherwise false.</returns>
        /// <exception cref="ArgumentNullException">state is null</exception>
        /// <exception cref="ArgumentException">state was created by a different HotKeyComponent instance</exception>
        /// <exception cref="ArgumentException">state is invalid type</exception>
        public bool Remove(HotKeyState state)
        {
            if (state == null)
            {
                throw new ArgumentNullException("state");
            }

            if (state.Owner != this)
            {
                throw new ArgumentException("The specified state was created by a different HotKeyComponent instance.", "state");
            }

            InternalHotKeyState hotkey = state as InternalHotKeyState; //cast state

            if (hotkey == null)                                        //validate state
            {
                throw new ArgumentException("The specified state is an invalid type.", "state");
            }

            if (localHotKeys.Remove(hotkey.ID)) //attempt to remove the hotkey
            {
                UnregisterHotKey(hotkey);       //unregister the hotkey
                return(true);
            }
            else
            {
                return(false);
            }
        }
        /// <summary>
        /// Attempts to create a new system-wide hot key with repeat options, user state and a callback.
        /// </summary>
        /// <param name="hotkey">The hot key to register.</param>
        /// <param name="allow_repeat">true to allow repeating key events; otherwise, false.</param>
        /// <param name="state">An optional user state.</param>
        /// <param name="callback">A callback to invoke when the hot key is pressed.</param>
        /// <param name="result">When this method returns, contains an instance of a new state representing the hot key registration or null if the registration failed.</param>
        /// <returns>true if a new system-wide hot key was registered; otherwise, false.</returns>
        public bool TryAdd(HotKey hotkey, bool allow_repeat, object state, EventHandler <HotKeyActivatedEventArgs> callback, out HotKeyState result)
        {
            int id = ++HotKeyID;                //get next hotkey id

            if (id > MAXIMUM_REGISTERHOTKEY_ID) //max value id can be
            {
                throw new NotImplementedException($"HotKeyComponent cannot support identification numbers greater-than {MAXIMUM_REGISTERHOTKEY_ID}; previously unregistered hotkey ids should be reused.");
            }

            //create internal state for timestamps, state and callback
            InternalHotKeyState key_state = new InternalHotKeyState(this, id, hotkey, allow_repeat, state, callback);

            if (RegisterHotKey(key_state))       //register hot key with system
            {
                localHotKeys.Add(id, key_state); //add to collection
                result = key_state;              //set state
                return(true);
            }

            result = null;
            return(false);
        }
 /// <summary>
 /// Attempts to create a new system-wide hot key with repeat options and a callback.
 /// </summary>
 /// <param name="key">The hot key to register.</param>
 /// <param name="modifier">The key modifier to associate with the key.</param>
 /// <param name="allow_repeat">true to allow repeating key events; otherwise, false.</param>
 /// <param name="callback">A callback to invoke when the hot key is pressed.</param>
 /// <param name="result">When this method returns, contains an instance of a new state representing the hot key registration or null if the registration failed.</param>
 /// <returns>true if a new system-wide hot key was registered; otherwise, false.</returns>
 public bool TryAdd(Keys key, Keys modifier, bool allow_repeat, EventHandler <HotKeyActivatedEventArgs> callback, out HotKeyState result)
 {
     return(TryAdd(key, modifier, allow_repeat, null, callback, out result));
 }
 /// <summary>
 /// Attempts to create a new system-wide hot key with repeat options, user state and a callback.
 /// </summary>
 /// <param name="key">The hot key to register.</param>
 /// <param name="modifier">The key modifier to associate with the key.</param>
 /// <param name="allow_repeat">true to allow repeating key events; otherwise, false.</param>
 /// <param name="state">An optional user state.</param>
 /// <param name="callback">A callback to invoke when the hot key is pressed.</param>
 /// <param name="result">When this method returns, contains an instance of a new state representing the hot key registration or null if the registration failed.</param>
 /// <returns>true if a new system-wide hot key was registered; otherwise, false.</returns>
 public bool TryAdd(Keys key, Keys modifier, bool allow_repeat, object state, EventHandler <HotKeyActivatedEventArgs> callback, out HotKeyState result)
 {
     return(TryAdd(new HotKey(key, modifier), allow_repeat, state, callback, out result));
 }
 /// <summary>
 /// Attempts to create a new system-wide hot key with repeat options and a user state.
 /// </summary>
 /// <param name="key">The hot key to register.</param>
 /// <param name="modifier">The key modifier to associate with the key.</param>
 /// <param name="allow_repeat">true to allow repeating key events; otherwise, false.</param>
 /// <param name="state">An optional user state.</param>
 /// <param name="result">When this method returns, contains an instance of a new state representing the hot key registration or null if the registration failed.</param>
 /// <returns>true if a new system-wide hot key was registered; otherwise, false.</returns>
 public bool TryAdd(Keys key, Keys modifier, bool allow_repeat, object state, out HotKeyState result)
 {
     return(TryAdd(key, modifier, allow_repeat, state, null, out result));
 }