由于.net并没有提供快捷键的库,所以要使用该功能得通过api实现。
在winapi中,注册和注销全局快捷键分别是通过RegisterHotKey和UnregisterHotKey函数实现。在c#中直接使用该api显得不够简洁,这里我提供了一个友好点的封装。
代码如下:
static class Hotkey
{
系统api
/// <summary> 
/// 注册快捷键 
/// </summary> 
/// <param name="hWnd">持有快捷键窗口的句柄</param> 
/// <param name="fsModifiers">组合键</param> 
/// <param name="vk">快捷键的虚拟键码</param> 
/// <param name="callBack">回调函数</param> 
public static void Regist(IntPtr hWnd, HotkeyModifiers fsModifiers, Keys vk, HotKeyCallBackHanlder callBack)
{
int id = keyid++;
if (!RegisterHotKey(hWnd, id, fsModifiers, vk))
throw new Exception("regist hotkey fail.");
keymap[id] = callBack;
}
/// <summary> 
/// 注销快捷键 
/// </summary> 
/// <param name="hWnd">持有快捷键窗口的句柄</param> 
/// <param name="callBack">回调函数</param> 
public static void UnRegist(IntPtr hWnd, HotKeyCallBackHanlder callBack)
{
foreach (KeyValuePair<int, HotKeyCallBackHanlder> var in keymap)
{
if (var.Value == callBack)
UnregisterHotKey(hWnd, var.Key);
}
}
/// <summary> 
/// 快捷键消息处理 
/// </summary> 
public static void ProcessHotKey(System.Windows.Forms.Message m)
{
if (m.Msg == WM_HOTKEY)
{
int id = m.WParam.ToInt32();
HotKeyCallBackHanlder callback;
if (keymap.TryGetValue(id, out callback))
{
callback();
}
}
}
const int WM_HOTKEY = 0x312;
static int keyid = 10;
static Dictionary<int, HotKeyCallBackHanlder> keymap = new Dictionary<int, HotKeyCallBackHanlder>();
public delegate void HotKeyCallBackHanlder();
}
enum HotkeyModifiers
{
MOD_ALT = 0x1,
MOD_CONTROL = 0x2,
MOD_SHIFT = 0x4,
MOD_WIN = 0x8
}
这里通过Hotkey类实现功能的封装,使用非常简单。下面为参考测试代码。
void Test()
{
MessageBox.Show("Test");
}
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
Hotkey.ProcessHotKey(m);
}
private void button1_Click(object sender, EventArgs e)
{
Hotkey.UnRegist(this.Handle, Test);
当程序form1启动时,注册了两个快捷键Alt+T和Ctrl+Shift+K,单击button1的时候会注销快捷键Alt+T。代码比较简单,这里就不多介绍了。
注:快捷键是通过消息触发的,因此要重载WndProc函数,在里面添加对快捷键回调消息的处理方法Hotkey.ProcessHotKey(m)。

转载于:https://www.cnblogs.com/top5/archive/2010/04/15/1712596.html

在c#中使用全局快捷键相关推荐

  1. C#注册和注销全局快捷键

    如何在C#代码中实现全局快捷键 C#.NET没有提供现成的API,我们通过引用系统的API进行注册 1.首先,创建一个快捷键操作的类,可以完成注册,注销的操作,具体说明看注释 public class ...

  2. Python中使用PyQt5创建的窗口添加全局快捷键(鼠标离开窗口时也可执行)

    Python中使用PyQt5创建的窗口添加全局快捷键 使用第三方库SystemHotKey来实现全局快捷键 库的安装 pip3 install system_hotkey 官方案例 from syst ...

  3. android中常用的快捷键

    2019独角兽企业重金招聘Python工程师标准>>> android中常用的快捷键 Eclipse快捷键-方便查找,呵呵,记性不好 行注释/销注释 Ctrl+/  块注释/销注释/ ...

  4. HTML中的全局属性

    一.全局属性和局部属性 每种元素都有自己规定的属性,这种属性成为局部属性.还有另外一种属性,他可以用来配置所有元素的共有行为,这种属性成为称为全局属性.全局属性可以用在任何一个元素身上,但是不一定会带 ...

  5. WPF设置全局快捷键

    网上的几分文档都似乎有点儿问题.也很可能是我自己的问题.下面是我的解决方案 第一步 引入到Winows API 偷懒直接写在类里 1: [DllImport("user32.dll" ...

  6. mac中强大的快捷键

    用mac本不过一年左右, 但是越用越感觉到mac的强大. 只是从快捷键这个方面去说吧. 与 windows 系统的比较 从接触电脑开始, 就是与windows为伍, 最初的window98, xp 等 ...

  7. win10 全局快捷键设置启动程序

    原文链接: win10 全局快捷键设置启动程序 上一篇: Python 安装anaconda 和conda 的简单使用 下一篇: surface pro win10 重装系统并解决屏幕亮度闪烁和降频的 ...

  8. linux中vim保存快捷键设置,Linux中vim操作快捷键非常简洁

    Linux中vim操作快捷键非常简洁 作者:PHPYuan 时间:2019-03-20 03:40:08 vim 中快捷键操作(简洁版) yy:复制 p:粘贴[大写P是光标所在行的上一行粘贴,小p反之 ...

  9. 浏览器中Vimium 插件快捷键

    浏览器中Vimium 插件快捷键 Vimium这个名字其实是Vim和Chromium的合体.很多人可能不知道Vim,Vim是一个类似于Vi的著名的功能强大.高度可定制的Linux等平台上的文本编辑器, ...

  10. idea中查找的快捷键

    idea中查找的快捷键 下面是查找IntelliJ IDEA编译后的class文件路径的具体操作步骤. 1.IDEA左上角打开File-Project Structure,或者直接按默认快捷键Ctrl ...

最新文章

  1. linux文件类型为ext4怎么扩展,如何扩展ext4分区和文件系统?
  2. PHP获取其他网站上的内容,php – 从外部网站获取DIV内容
  3. C语言 —— 整型(int)类型数据,做函数的参数,传值与传地址
  4. Linux getopt()函数 getopt_long()函数---转
  5. Java虚拟机的Heap监狱
  6. 使用vs2019编写dll
  7. 你知道 Redis 可以实现延迟队列吗?
  8. 【今天下午活动】从 HelloWorld 到 AntDesign,Blazor 将 .NET 带到现代前端圈
  9. MFC 定时器使用方式
  10. 论文解读 | 智能数据库的最新动态
  11. C++表达式:if 语句
  12. 人工智能、机器学习、神经网络和深度学习的关系
  13. Inno SetUp中文语言包以及在脚本中使用
  14. 什么是STL(模板库)?STL包含的一些内容及基础含义
  15. php 数据透视表,数据透视表PHP / MySQL
  16. PHP代码审计--百家CMS4.1.4项目实战(下)
  17. 前端的学习之路:初级HTML---超链接的锚点定位
  18. 从M1、Grace再到华为,缝合风为何会在芯片大厂中流行
  19. 创新与服务紧贴“本土化”,Galaxy S9|S9+不愧为三星诚意之作
  20. python+selenium自动化软件测试(第4章):场景判断与封装

热门文章

  1. Win10微软帐户切换不回Administrator本地帐户的解决方法--(转,虽转但亲测有效)
  2. No such file or directory
  3. import tool for Scripter Studio
  4. 利用Linux系统实现VLAN间的单臂路由及安全网关的功能
  5. openSUSE 跨版本升级
  6. Spire.Doc 教程:在C#,VB.NET创建、编辑和保存Word
  7. 揭秘ASM磁盘头信息
  8. Virident:PCIe SSD更能发挥闪存的特长
  9. Data crossstore between Mongo and JPA
  10. linux input设备冲突,linux input设备怎么固定event handler