汤俊飞博客

大帅比

winform 全局热键

 /// <summary>
 /// 热键
 /// </summary>
 public class HotKey
 {
     public const int WM_HOTKEY = 0x0312;
     //如果函数执行成功,返回值不为0。
     //如果函数执行失败,返回值为0。要得到扩展错误信息,调用GetLastError。
     [DllImport("user32.dll", SetLastError = true)]
     public static extern bool RegisterHotKey(
                     IntPtr hWnd,                //要定义热键的窗口的句柄
         int id,                     //定义热键ID(不能与其它ID重复)
         KeyModifiers fsModifiers,   //标识热键是否在按Alt、Ctrl、Shift、Windows等键时才会生效
         Keys vk                     //定义热键的内容
         );
     [DllImport("user32.dll", SetLastError = true)]
     public static extern bool UnregisterHotKey(
         IntPtr hWnd,                //要取消热键的窗口的句柄
         int id                      //要取消热键的ID
         );
     //定义了辅助键的名称(将数字转变为字符以便于记忆,也可去除此枚举而直接使用数值)
    

     /// <summary>
     /// 计算标识
     /// </summary>
     /// <param name="keyModifiers"></param>
     /// <param name="key"></param>
     /// <returns></returns>
     internal static int CalculateID(KeyModifiers keyModifiers, Keys key)
     {
         return (int)keyModifiers + ((int)key << 4);
     }

     public readonly KeyModifiers ModifierKey;
     public readonly Keys Key;
     public readonly int id;
     /// <summary>
     /// 
     /// </summary>
     /// <param name="keyModifiers"></param>
     /// <param name="key"></param>
     internal HotKey(KeyModifiers keyModifiers, Keys key)
     {
         this.ModifierKey = keyModifiers;
         this.Key = key;
         this.id = HotKey.CalculateID(keyModifiers, key);
     }

 }
  /// <summary>
  /// 热键事件参数
  /// </summary>
  public class HotKeyEventArgs : EventArgs
  {
      public readonly HotKey hotKey;
      public readonly DateTime dateTime;
      public HotKeyEventArgs(HotKey hotKey, DateTime time)
      {
          this.hotKey = hotKey;
          this.dateTime = time;
      }
  }
 /// <summary>
 /// 热键委托
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 public delegate void HotKeyEventHandler(object sender, HotKeyEventArgs e);
  [Flags]
  public enum KeyModifiers
  {
      None = 0,
      Alt = 1,
      Ctrl = 2,
      Shift = 4,
      WindowsKey = 8
  }

窗体基类

 public partial class UBaseForm : Form
 {
     public UBaseForm()
     {
         InitializeComponent();
     }

     protected Dictionary<int, HotKey> HotKeys;

     public void RegisterHotKey(KeyModifiers keyModifiers, Keys keys)
     {
         if (HotKeys == null) HotKeys = new Dictionary<int, HotKey>();

         int id = HotKey.CalculateID(keyModifiers, keys);
         if (!HotKeys.ContainsKey(id))
         {
             HotKey newHotkey = new HotKey(keyModifiers, keys);
             HotKeys.Add(id, newHotkey);
             HotKey.RegisterHotKey(Handle, id, newHotkey.ModifierKey, newHotkey.Key);
         }
     }


     public void UnRegisterHotKey(KeyModifiers keyModifiers, Keys keys)
     {
         if (HotKeys == null) return;

         int id = HotKey.CalculateID(keyModifiers, keys);
         if (HotKeys.ContainsKey(id))
         {
             HotKeys.Remove(id);
             HotKey.UnregisterHotKey(Handle, id);
         }
     }
     /// <summary>
     /// 在热键按下时发生
     /// </summary>
     [Description("在热键按下时发生")]
     public event HotKeyEventHandler HotKeyEventHandler;
     /// 
     /// 监视Windows消息
     /// 重载WndProc方法,用于实现热键响应
     /// 
     /// 
     protected override void WndProc(ref Message m)
     {
         if(m.Msg == HotKey.WM_HOTKEY)
         {
             int hotKeyId = (int)(m.WParam);
             if (HotKeys != null && HotKeys.ContainsKey(hotKeyId))
             {
                 HotKeyEventHandler?.Invoke(this, new HotKeyEventArgs(HotKeys[hotKeyId], DateTime.Now));
             }
         }
        
         
         base.WndProc(ref m);
     }
 }

使用方式

 public partial class MainForm : UBaseForm
 {
     public MainForm()
     {
         InitializeComponent();
     }

     private void MainForm_Load(object sender, EventArgs e)
     {
         RegisterHotKey(KeyModifiers.Ctrl, Keys.T);
         RegisterHotKey(KeyModifiers.Ctrl, Keys.W);
     }

     private void MainForm_HotKeyEventHandler(object sender, HotKeyEventArgs e)
     {
         if (e.hotKey.ModifierKey == KeyModifiers.Ctrl && e.hotKey.Key == Keys.T)
         {
             //执行方法
         }
         if (e.hotKey.ModifierKey == KeyModifiers.Ctrl && e.hotKey.Key == Keys.W)
         {
             //执行方法
         }
     }

    
 }


发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

«    2024年12月    »
1
2345678
9101112131415
16171819202122
23242526272829
3031
  • 文章总数:14
  • 页面总数:1
  • 分类总数:6
  • 标签总数:6
  • 评论总数:0
  • 浏览总数:803
您好,欢迎到访网站!
  查看权限