C#全局热键设置与窗体热键设置实例
本文实例讲述了c#全局热键设置与窗体热键设置,分享给大家供大家参考。具体实现方法如下:
1、窗体热键
首先要设置主窗体keypreview为true,可直接在属性中进行设置,
或者在窗体加载中设置: this.keypreview = true;
然后添加窗体keydown事件,如下:
{
if (e.alt && e.shift && e.control && e.keycode == keys.s)
{
messagebox.show("我按了control +shift +alt +s");
}
}
2、全局热键设置
定义api函数 》 注册热键 》 卸载热键
我这里定义了apphotkey类,全部代码如下:
{
[dllimport("kernel32.dll")]
public static extern uint getlasterror();
//如果函数执行成功,返回值不为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
}
/// <summary>
/// 注册热键
/// </summary>
/// <param name="hwnd">窗口句柄</param>
/// <param name="hotkey_id">热键id</param>
/// <param name="keymodifiers">组合键</param>
/// <param name="key">热键</param>
public static void regkey(intptr hwnd, int hotkey_id, keymodifiers keymodifiers, keys key)
{
try
{
if (!registerhotkey(hwnd, hotkey_id, keymodifiers, key))
{
if (marshal.getlastwin32error() == 1409) { messagebox.show("热键被占用 !"); }
else
{
messagebox.show("注册热键失败!");
}
}
}
catch (exception) { }
}
/// <summary>
/// 注销热键
/// </summary>
/// <param name="hwnd">窗口句柄</param>
/// <param name="hotkey_id">热键id</param>
public static void unregkey(intptr hwnd, int hotkey_id)
{
//注销id号为hotkey_id的热键设定
unregisterhotkey(hwnd, hotkey_id);
}
}
重写窗体的wndproc函数,在窗口创建的时候注册热键,窗口销毁时销毁热键,代码如下:
private const int wm_create = 0x1; //窗口消息-创建
private const int wm_destroy = 0x2; //窗口消息-销毁
private const int space = 0x3572; //热键id
protected override void wndproc(ref message m)
{
base.wndproc(ref m);
switch (m.msg)
{
case wm_hotkey: //窗口消息-热键id
switch (m.wparam.toint32())
{
case space: //热键id
messagebox.show("我按了control +shift +alt +s");
break;
default:
break;
}
break;
case wm_create: //窗口消息-创建
apphotkey.regkey(handle, space, apphotkey.keymodifiers.ctrl | apphotkey.keymodifiers.shift | apphotkey.keymodifiers.alt, keys.s);
break;
case wm_destroy: //窗口消息-销毁
apphotkey.unregkey(handle, space); //销毁热键
break;
default:
break;
}
}
希望本文所述对大家的c#程序设计有所帮助。