在窗体不是焦点时设置全局快捷键
添加窗体以后,我们可以通过一系列事件给窗体添加快捷键
private void Form1_KeyUp(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.B) { MessageBox.Show("B"); } }
这样当我们在按下"B"键时,就可以弹出对话框,但这种方法有一个弱点:窗体必须在获取焦点的情况下,按了才起作用。我们可以通过使用全局快捷键的方法来解决这个问题,也就是在任何时候按下,程序都会响应快捷键。
整体代码及使用方法如下:using System.Runtime.InteropServices; namespace hotkey { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_KeyUp(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.B) { MessageBox.Show("B"); } } HotKey hk = new HotKey(); private void Form1_Load(object sender, EventArgs e) { hk.Reg(Handle, 100, 1 | 2, Keys.G); } private void Form1_Leave(object sender, EventArgs e) { hk.UnReg(Handle, 100); } protected override void WndProc(ref Message m) { int HotKeyNum = hk.Handle(ref m); switch (HotKeyNum) { case 100: MessageBox.Show("按下了系统热键!"); break; } base.WndProc(ref m); } /// /// 注册系统快捷键 /// --------------说明------------------ /// 1、在窗体的Activated事件中写入如下代码: /// Reg(Handle, 100, 1 | 2, Keys.G); /// Alt = 1,Ctrl = 2,Shift = 4,WindowsKey = 8 /// 2、重写WndProc方法 /// protected override void WndProc(ref Message m) /// { /// int HotKeyNum = Handle(ref m); /// switch (HotKeyNum) /// { /// case 100: /// MessageBox.Show("HAHA"); /// break; /// } /// base.WndProc(ref m); /// } /// 3、在窗体的Leave事件中写入如下代码 /// UnReg(Handle, 100); /// ------------------------------------ /// public class HotKey { [DllImport("user32.dll", SetLastError = true)] static extern bool RegisterHotKey( IntPtr hWnd, //要定义热键的窗口的句柄 int id, //定义热键ID(不能与其它ID重复) int fsModifiers, //标识热键是否在按Alt、Ctrl、Shift、Windows等键时才会生效 Keys vk //定义热键的内容 ); [DllImport("user32.dll", SetLastError = true)] static extern bool UnregisterHotKey( IntPtr hWnd, //要取消热键的窗口的句柄 int id //要取消热键的ID ); /// /// 注册系统快捷键 /// --------------说明------------------ /// 在 Form1_Activated 或 Load 事件中 /// Reg(Handle, 100, 1 | 2, Keys.G); /// Alt = 1,Ctrl = 2,Shift = 4,WindowsKey = 8 /// ------------------------------------ /// /// 写handle即可 /// 该快捷键的注册数字,如100 /// 辅助键如Ctrl,KeyModifiers中的一个 /// 与fsModifiers的组合键,如Keys.A /// public bool Reg(IntPtr hWnd, int id, int fzKeys, Keys vk) { return RegisterHotKey(hWnd, id, fzKeys, vk); } /// /// 注销系统快捷键 /// --------------说明------------------ /// 在 Form1_Leave 或 FormClosed 事件中 /// UnReg(Handle, 100); /// ------------------------------------ /// /// 写字handle即可 /// 该快捷键的数字,如100 /// public bool UnReg(IntPtr hWnd, int id) { return UnregisterHotKey(hWnd, id); } /// /// 得到快捷键的ID /// /// /// public int Handle(ref Message m) { const int WM_HOTKEY = 0x0312; //按快捷键 switch (m.Msg) { case WM_HOTKEY: return m.WParam.ToInt32(); } return 0; } } } }说明
在Form1_Load时,注册快捷键
//Handle照抄就行
//100是快捷键号,只要整个程序对得上就行。
//1|2这里我写的是按下ctrl和alt,这个在我程序中都有说明
//Alt = 1,Ctrl = 2,Shift = 4,WindowsKey = 8
//同时还得加上G键
hk.Reg(Handle, 100, 1 | 2, Keys.G);
在Form1_Leave时,注销
hk.UnReg(Handle, 100);
protected override void WndProc中根据热键号做不同任务运行调试会发现,按"B"键时弹出对话框只能在获取焦点时,或者说你得看得到窗体,还要点下它这时才行,而按ctrl+alt+G时,在任何情况下,都可以弹出对话框。我在本例中只是用对话框做了个例子,大家可以尝试做其它任务。