C#热键
时间:2011-02-05 来源:nicesoft
用:
代码private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if (e.Control && e.KeyCode == Keys.A)
{
btnTest_Click(this, EventArgs.Empty);
}
}
方法固然简单有效!但是有没有发现一个问题?那就是当程序失去焦点的时候这个热键(快捷键)就不管用了!那怎么办呢?其实办法还
是有的!又要用到Win32API了这次用:RegisterHotKey 和 UnregisterHotKey这2个函数的意思不需要我解释吧! 看表面意思
就知道了 注册热键和注销热键
代码
public class HotKey//如果函数执行成功,返回值不为0。//如果函数执行失败,返回值为0。要得到扩展错误信息,调用GetLastError。
{
[DllImportAttribute("user32.dll", EntryPoint = "RegisterHotKey")]
public static extern bool RegisterHotKey
(
IntPtr hWnd, //要注册热键的窗口句柄
int id, //热键编号 定义热键ID(不能与其它ID重复)
int fsModifiers, //特殊键如:Ctrl,Alt,Shift,Window //标识热键是否在按Alt、Ctrl、Shift、Windows等键时才会生效
int vk //一般键如:A B C F1,F2 等 定义热键的内容
);
[DllImportAttribute("user32.dll", EntryPoint = "UnregisterHotKey")]
public static extern bool UnregisterHotKey
(
IntPtr hWnd, //要取消热键的窗口的句柄
int id //热键编号上面注册热键的编号 要取消热键的ID
);
[Flags()]//附上Flags特性后,用该枚举变量是既可以象整数一样进行按位的“|”或者按位的“&”操作
public enum MyKeys
{
None = 0,
Alt = 1,
Ctrl = 2,
Shift = 4,
Win = 8
}
public const int WM_HOTKEY = 0x312;
}
用RegisterHotKey注册的热键即时在失去焦点的情况下也可以有效!
所有实现代码如下:
using System.Runtime.InteropServices;
代码
private void Form1_Load(object sender, EventArgs e)
{
HotKey.RegisterHotKey(this.Handle, 200, (int)HotKey.MyKeys.Alt, (int)Keys.A); //注册热键Alt+A
//HotKey.RegisterHotKey(this.Handle, 200, (int)HotKey.MyKeys.Ctrl | (int)HotKey.MyKeys.Alt, (int)Keys.A); //注册热键Ctrl+Alt+A
//HotKey.RegisterHotKey(this.Handle, 200, (int)HotKey.MyKeys.None, (int)Keys.F2);// 注册热键F2
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
HotKey.UnregisterHotKey(this.Handle, 200); //注销热键
}
private void btnTest_Click(object sender, EventArgs e)
{
MessageBox.Show("btnTest单击事件被触发!");
}
protected override void WndProc(ref Message m)
{
if (m.Msg == HotKey.WM_HOTKEY)
{
switch (m.WParam.ToInt32())
{
case 200:
btnTest_Click(this, EventArgs.Empty);
break;
}
}
base.WndProc(ref m);
}
相关阅读 更多 +