添加窗体以后,我们可以通过一系列事件给窗体添加快捷键

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);
}
/// <summary>
/// 注册系统快捷键
/// <para>--------------说明------------------</para>
/// <para>1、在窗体的Activated事件中写入如下代码:</para>
/// <para>Reg(Handle, 100, 1 | 2, Keys.G);</para>
/// <para>Alt = 1,Ctrl = 2,Shift = 4,WindowsKey = 8</para>
/// <para>2、重写WndProc方法</para>
/// <para>protected override void WndProc(ref Message m)</para>
/// <para>{</para>
/// <para> int HotKeyNum = Handle(ref m);</para>
/// <para> switch (HotKeyNum)</para>
/// <para> {</para>
/// <para> case 100:</para>
/// <para> MessageBox.Show("HAHA");</para>
/// <para> break;</para>
/// <para> }</para>
/// <para> base.WndProc(ref m);</para>
/// <para>}</para>
/// <para>3、在窗体的Leave事件中写入如下代码</para>
/// <para>UnReg(Handle, 100);</para>
/// <para>------------------------------------</para>
/// </summary>
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
);
/// <summary>
/// 注册系统快捷键
/// <para>--------------说明------------------</para>
/// <para>在 Form1_Activated 或 Load 事件中 </para>
/// <para>Reg(Handle, 100, 1 | 2, Keys.G);</para>
/// <para>Alt = 1,Ctrl = 2,Shift = 4,WindowsKey = 8</para>
/// <para>------------------------------------</para>
/// </summary>
/// <param name="hWnd">写handle即可</param>
/// <param name="id">该快捷键的注册数字,如100</param>
/// <param name="fsModifiers">辅助键如Ctrl,KeyModifiers中的一个</param>
/// <param name="vk">与fsModifiers的组合键,如Keys.A</param>
/// <returns></returns>
public bool Reg(IntPtr hWnd, int id, int fzKeys, Keys vk)
{
return RegisterHotKey(hWnd, id, fzKeys, vk);
}
/// <summary>
/// 注销系统快捷键
/// <para>--------------说明------------------</para>
/// <para>在 Form1_Leave 或 FormClosed 事件中 </para>
/// <para>UnReg(Handle, 100);</para>
/// <para>------------------------------------</para>
/// </summary>
/// <param name="hWnd">写字handle即可</param>
/// <param name="id">该快捷键的数字,如100</param>
/// <returns></returns>
public bool UnReg(IntPtr hWnd, int id)
{
return UnregisterHotKey(hWnd, id);
}
/// <summary>
/// 得到快捷键的ID
/// </summary>
/// <param name="m"></param>
/// <returns></returns>
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时,在任何情况下,都可以弹出对话框。我在本例中只是用对话框做了个例子,大家可以尝试做其它任务。
