using Newtonsoft.Json; using System; using System.Text; using System.Windows.Forms; namespace NumpadMonitor { public class KeyInfo { public Keys Key { get; private set; } public int FsModifiers { get; private set; } public IntPtr KeyCode { get; private set; } internal void SetKeyCode(IntPtr keyCode) { if (KeyCode == IntPtr.Zero) KeyCode = keyCode; else throw new ArgumentException("Parameter was already set, and cannot be set again"); } public KeyInfo(Keys key, int fsModifiers = 0) { Key = key; FsModifiers = fsModifiers; } [JsonConstructor] public KeyInfo(Keys key, int fsModifiers, IntPtr keyCode) { Key = key; FsModifiers = fsModifiers; KeyCode = keyCode; } public static int GetModifierInt(Modifier[] modifiers) { int modifierCode = 0; foreach (Modifier modifier in modifiers) { switch (modifier) { case Modifier.Alt: modifierCode |= 0b0001; break; case Modifier.Ctrl: modifierCode |= 0b0010; break; case Modifier.Shift: modifierCode |= 0b0100; break; case Modifier.Win: modifierCode |= 0b1000; break; default: throw new ArgumentOutOfRangeException("modifier", "Modifier not in enum"); } } return modifierCode; } public override string ToString() { StringBuilder sb = new StringBuilder(); if (FsModifiers != 0) { if ((FsModifiers & 0b0010) == 0b0010) sb.Append("Ctrl + "); if ((FsModifiers & 0b0001) == 0b0001) sb.Append("Alt + "); if ((FsModifiers & 0b0100) == 0b0100) sb.Append("Shift + "); if ((FsModifiers & 0b1000) == 0b1000) sb.Append("Win + "); } sb.Append(Key.ToString()); return sb.ToString(); } public override bool Equals(object obj) { return obj is KeyInfo info && Key == info.Key && FsModifiers == info.FsModifiers; } public override int GetHashCode() { int hash = 17; hash = hash * 23 + (int)Key; hash = hash * 23 + FsModifiers; return hash; } } public enum Modifier { Alt, Ctrl, Shift, Win } }