view ShortcutKeyFinder/Hotkey.cs @ 0:209d9210c18f default tip

It works.
author Brad Greco <brad@bgreco.net>
date Sat, 25 Jun 2016 13:42:54 +1000
parents
children
line wrap: on
line source

using System.Collections.Generic;
using System.Windows.Forms;

namespace ShortcutKeyFinder
{
    /// <summary>Provides a means to encode and decode hotkeys in the format expected by the Win32 API</summary>
    class Hotkey
    {
        private List<Keys> _modifierKeys = new List<Keys>() { Keys.ShiftKey, Keys.ControlKey, Keys.Menu };
        // Windows API values
        public ushort HOTKEYF_SHIFT   = 0x01 << 8;
        public ushort HOTKEYF_CONTROL = 0x02 << 8;
        public ushort HOTKEYF_ALT     = 0x04 << 8;
        public ushort HOTKEYF_EXT     = 0x08 << 8;

        /// <summary>Raw hotkey value to use in Win32 functions</summary>
        public ushort RawHotkey { get; set; }

        /// <summary>Shift key state</summary>
        public bool Shift
        {
            get { return (RawHotkey & HOTKEYF_SHIFT) != 0; }
            set { if (value) RawHotkey |= HOTKEYF_SHIFT; else RawHotkey &= (ushort)~HOTKEYF_SHIFT; }
        }

        /// <summary>Control key state</summary>
        public bool Control
        {
            get { return (RawHotkey & HOTKEYF_CONTROL) != 0; }
            set { if (value) RawHotkey |= HOTKEYF_CONTROL; else RawHotkey &= (ushort)~HOTKEYF_CONTROL; }
        }

        /// <summary>Alt key state</summary>
        public bool Alt
        {
            get { return (RawHotkey & HOTKEYF_ALT) != 0; }
            set { if (value) RawHotkey |= HOTKEYF_ALT; else RawHotkey &= (ushort)~HOTKEYF_ALT; }
        }

        /// <summary>Ext key state</summary>
        /// <remarks>Probably useless nowadays</remarks>
        public bool Ext
        {
            get { return (RawHotkey & HOTKEYF_EXT) != 0; }
            set { if (value) RawHotkey |= HOTKEYF_EXT; else RawHotkey &= (ushort)~HOTKEYF_EXT; }
        }

        /// <summary>The key code portion of the hotkey data</summary>
        /// <remarks>The key code is stored in the lower byte of the hotkey</remarks>
        public byte KeyCode
        {
            get { return (byte)(RawHotkey & 0x00FF); }
            set { RawHotkey = (ushort)((RawHotkey & 0xFF00) | value); }
        }

        /// <summary>Default constructor</summary>
        public Hotkey() { }

        /// <summary>Constructor with hotkey initializer</summary>
        /// <param name="hotkey">Hotkey value for Win32 API calls</param>
        public Hotkey(ushort hotkey)
        {
            RawHotkey = hotkey;
        }

        /// <summary>Converts the hotkey data into a friendly string</summary>
        public override string ToString()
        {
            return string.Format("{0}{1}{2}{3}{4}",
                Control ? "Ctrl+" : "",
                Alt ? "Alt+" : "",
                Shift ? "Shift+" : "",
                Ext ? "Ext+" : "",
                _modifierKeys.Contains((Keys)KeyCode) ? "" : new KeysConverter().ConvertToString((int)KeyCode));
        }

        /// <summary>Checks if two Hotkey objects have the same key combination</summary>
        public override bool Equals(object obj)
        {
            Hotkey hotkey = obj as Hotkey;
            return hotkey != null && hotkey.RawHotkey == RawHotkey;
        }

        public override int GetHashCode()
        {
            return RawHotkey.GetHashCode();
        }
    }
}