要设置快捷键必须使用user32.dll下面的两个方法。
bool registerhotkey( //注册系统热键的api函数
hwnd hwnd,
int id,
uint fsmodifiers,
uint vk
);
bool unregisterhotkey( //删除系统热键的api函数
hwnd hwnd,
int id
);
在c#中引用命名空间system.runtime.interopservices;来加载非托管类user32.dll
using system;
using system.collections.generic;
using system.componentmodel;
using system.data;
using system.drawing;
using system.text;
using system.windows.forms;
namespace hotkey
{
public enum keymodifiers //组合键枚举
{
none = 0,
alt = 1,
control = 2,
shift = 4,
windows = 8
}
public partial class form1 : form
{
/*
* registerhotkey函数原型及说明:
* bool registerhotkey(
* hwnd hwnd, // window to receive hot-key notification
* int id, // identifier of hot key
* uint fsmodifiers, // key-modifier flags
* uint vk // virtual-key code);
* 参数 id为你自己定义的一个id值
* 对一个线程来讲其值必需在0x0000 - 0xbfff范围之内,十进制为0~49151
* 对dll来讲其值必需在0xc000 - 0xffff 范围之内,十进制为49152~65535
* 在同一进程内该值必须唯一参数 fsmodifiers指明与热键联合使用按键
* 可取值为:mod_alt mod_control mod_win mod_shift参数,或数字0为无,1为alt,2为control,4为shift,8为windows
* vk指明热键的虚拟键码
*/
[system.runtime.interopservices.dllimport("user32.dll")] //申明api函数
public static extern bool registerhotkey(
intptr hwnd, // handle to window
int id, // hot key identifier
uint fsmodifiers, // key-modifier options
keys vk // virtual-key code
);
[system.runtime.interopservices.dllimport("user32.dll")] //申明api函数
public static extern bool unregisterhotkey(
intptr hwnd, // handle to window
int id // hot key identifier
);
public form1()
{
initializecomponent();
}
private void processhotkey(message m) //按下设定的键时调用该函数
{
intptr id = m.wparam; //intptr用于表示指针或句柄的平台特定类型
//messagebox.show(id.tostring());
string sid = id.tostring();
switch (sid)
{
case "100":
messagebox.show("调用a函数");
break;
case "200":
messagebox.show("调用b函数");
break;
}
}
private void form1_load(object sender, eventargs e)
{
//handle为当前窗口的句柄,继续自control.handle,control为定义控件的基类
//registerhotkey(handle, 100, 0, keys.a); //注册快捷键,热键为a
//registerhotkey(handle, 100, keymodifiers.alt | keymodifiers.control, keys.b);//这时热键为alt+ctrl+b
//registerhotkey(handle, 100, 1, keys.b); //1为alt键,热键为alt+b
registerhotkey(handle, 100, 2,keys.a); //定义热键为alt+tab,这里实现了屏幕系统alt+tab键
registerhotkey(handle, 200, 2, keys.b); //注册2个热键,根据id值100,200来判断需要执行哪个函数
}
private void button1_click(object sender, eventargs e) //重新设置热键
{
unregisterhotkey(handle, 100);//卸载快捷键
registerhotkey(handle, 100, 2, keys.c); //注册新的快捷键,参数0表示无组合键
}
private void form1_formclosing(object sender, formclosingeventargs e) //退出程序时缷载热键
{
unregisterhotkey(handle, 100);//卸载第1个快捷键
unregisterhotkey(handle, 200); //缷载第2个快捷键
}
//重写wndproc()方法,通过监视系统消息,来调用过程
protected override void wndproc(ref message m)//监视windows消息
{
const int wm_hotkey = 0x0312;//如果m.msg的值为0x0312那么表示用户按下了热键
switch (m.msg)
{
case wm_hotkey:
processhotkey(m);//按下热键时调用processhotkey()函数
break;
}
base.wndproc(ref m); //将系统消息传递自父类的wndproc
}
}
}
新闻热点
疑难解答