最近在用C#写项目,遇到了这个问题。便去网上查找了一番,在此整理备忘。 不得不说,作为微软爸爸创造的语言,果然是很方便。 虽然Python的语法总体上很简单,但是在注册全局热键这一块还是不如C#的,毕竟C#本来就是微软的东西,自家的东西自然要多多“照顾”。 下面开始贴代码:
第一种方法:自己动手,丰衣足食!
先在Winform项目中添加一个“类”,就叫Hotkey.cs吧
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace KoalaStudio.BookshopManager
{
class HotKey
{
//如果函数执行成功,返回值不为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
);
//定义了辅助键的名称(将数字转变为字符以便于记忆,也可去除此枚举而直接使用数值)
[Flags()]
public enum KeyModifiers
{
None = 0,
Alt = 1,
Ctrl = 2,
Shift = 4,
WindowsKey = 8
}
}
}
不用多想,直接粘过去。需要理解的地方可以慢慢回味。
接下来修改窗体的OnLoad事件:
private void Form_OnLoad(object sender, EventArgs e)
{
//注册热键Shift+S,Id号为100。HotKey.KeyModifiers.Shift也可以直接使用数字4来表示。
HotKey.RegisterHotKey(Handle, 100, HotKey.KeyModifiers.Shift, Keys.S);
//注册热键Ctrl+B,Id号为101。HotKey.KeyModifiers.Ctrl也可以直接使用数字2来表示。
HotKey.RegisterHotKey(Handle, 101, HotKey.KeyModifiers.Ctrl, Keys.B);
//注册热键Alt+D,Id号为102。HotKey.KeyModifiers.Alt也可以直接使用数字1来表示。
HotKey.RegisterHotKey(Handle, 102, HotKey.KeyModifiers.Alt, Keys.D);
}
这里调用之前写的类注册热键
注册了之后再窗体销毁时记得要取消注册,不然下次注册同样ID的热键时会出错
private void FrmSale_Leave(object sender, EventArgs e)
{
//注销Id号为100的热键设定
HotKey.UnregisterHotKey(Handle, 100);
//注销Id号为101的热键设定
HotKey.UnregisterHotKey(Handle, 101);
//注销Id号为102的热键设定
HotKey.UnregisterHotKey(Handle, 102);
}
既然设置了快捷键,那么我们分别要让它们对应干什么呢。绑定事件! 在Winform的主类中重写WndProc方法
protected override void WndProc(ref Message m)
{
const int WM_HOTKEY = 0x0312;
//按快捷键
switch (m.Msg)
{
case WM_HOTKEY:
switch (m.WParam.ToInt32())
{
case 100: //按下的是Shift+S,对应之前注册热键时设置的ID
//此处填写快捷键响应代码,对应之前注册热键时设置的ID
MessageBox.Show("按下了Shift + S !");
break;
case 101: //按下的是Ctrl+B
//此处填写快捷键响应代码,对应之前注册热键时设置的ID
MessageBox.Show("按下了Control + B !");
break;
case 102: //按下的是Alt+D
//此处填写快捷键响应代码,对应之前注册热键时设置的ID
MessageBox.Show("按下了Alt + D !");
break;
}
break;
}
base.WndProc(ref m);
}
第一种方法完毕,大家赶紧试试吧! 由于是全局热键,只要程序开着,你在哪里按快捷键都有效 虽然看起来很麻烦,但是能收获到属于自己动手的那一份快乐。
说的好!我选择第二种方法。 ……
第二种方法:不要重复造轮子!直接把别人整好的东西往里一扔不就好了
CSkin大家或许听说过,是个美化Winform的。虽然没有DSkin优秀,但是CSkin是免费的啊! 走,赶紧先去整到dll去 下载完毕后解压看到有一个2.0和一个4.0,根据自己解决方案的.Net Framework版本老老实实地选择。 接下来按照说明书上面的去做,下面贴出完整的“说明书”:
说明: 首先CSkin界面库是完全免费的,可以任意使用,并且代码中无任何限制,如果有其他问题或者想购买界面库源码的可以加我QQ:345015918。 文件夹中的2.0和4.0指的是netframework版本。 使用教程: 1.工具箱右键-新建项-命名CSkin。 2.将CSkin.dll拖到新建的工具箱栏里。 3.控件添加完毕,控件拖拽到界面即可使用和引用。 4.窗体美化需要继承CCSkinMain。 如: public partial class FrmMain : Form 改成: public partial class FrmMain : CCSkinMain 并且引用命名空间: using CCWin; 5.窗体还可以继承以下等多种主题: Skin_Color,Skin_DevExpress,Skin_Mac,Skin_Metro,Skin_VS 详细图解参考此帖: http://bbs.cskin.net/thread-803-1-1.html 更多CSkin案例源码下载: http://bbs.cskin.net/thread-800-1-1.html
已经写得明明白白得了,应该没问题。 按照上述步骤做完后,接着看 拖一个如图的控件出来,看到HotKey不由得欣喜若狂 这个控件和Timer一样,都是“看不见”的 看图说话: 注意我红色标出来的地方 Enabled记得改成True 在Key里面不要添加修饰符(键),会出错的
最后按下快捷键,成功弹出MessageBox 就是这么简单 由于也是全局热键,所以只要程序在运行,在哪里按快捷键程序都是会有反应的
以上就是注册全局热键的两种方法,请自行采纳使用