C# 如何实现热键注册 RegisterHotKey
2013-01-05 18:23
441 查看
RegisterHotKey(this.Handle, 247696411, 0, (UInt32)Keys.***); http://baike.baidu.com/view/1080084.html?tp=0_10 这里有RegisterHotKey 的介绍 RegisterHotKey 函数功能:该函数定义一个系统范围的热键。 函数原型:BOOL RegisterHotKey(HWND hWnd,intid,UINT fsModifiers,UINT vk); 参数: hWnd:接收热键产生WM_HOTKEY消息的窗口句柄。若该参数NULL,传递给调用线程的WM_HOTKEY消息必须在消息循环中中进行处理。 id:定义热键的标识符。调用线程中的其他热键不能使用同样的标识符。应用功能程序必须定义一个0X0000-0xBFFF范围的值。一个共享的动态链接库(DLL)必须定义一个0xC000-0xFFFF范围的值伯GlobalAddAtom函数返回该范围)。为了避免与其他动态链接库定义的热键冲突,一个DLL必须使用GlobalAddAtom函数获得热键的标识符。 fsModifoers:定义为了产生WM_HOTKEY消息而必须与由nVirtKey参数定义的键一起按下的键。该参数可以是如下值的组合: MOD_ALT:按下的可以是任一Alt键。MOD_CONTROL:按下的可以是任一Ctrl键。 MOD_SHIFT:按下的可以是任一Shift键。 MOD_WIN:按下的可以是任一Windows按键。这些键可以用Microsoft Windows日志记录下来。 vk:定义热键的虚拟键码。 返回值:若函数调用成功,返回一个非O值。若函数调用失败,则返回值为0。若要获得更多的错误信息,可以调用GetLastError函数。 API别忘了 using System.Runtime.InteropServices; [DllImport("user32.dll")] public static extern UInt32 RegisterHotKey(IntPtr hWnd, UInt32 id, UInt32 fsModifiers, UInt32 vk); //API public Form1() { InitializeComponent(); RegisterHotKey(this.Handle, 247696411, 0, (UInt32)Keys.F10); //注册热键 } 阅读 //重写消息循环 protected override void WndProc(ref Message m) { const int WM_HOTKEY = 0x0312; // m.WParam.ToInt32() 要和 注册热键时的第2个参数一样 if (m.Msg == WM_HOTKEY && m.WParam.ToInt32() == 247696411) //判断热键 { //写上你的代码 } base.WndProc(ref m); } 写上代码后 只要 在程序运行时按F10就可以触发热键更改按键可以在 注册时改 2. 在应用中,我们可能会需要实现像Ctrl+C复制、Ctrl+V粘贴这样的快捷键,本文简单介绍了它的实现,并给出了一个实现类。 (1)建立一个类文件,命名为HotKey.cs,代码如下: using System; using System.Collections.Generic; using System.Runtime.InteropServices; using System.Windows.Forms; namespace KoalaStudio.BookshopManager { class HotKey { //如果函数执行成功,返回值不为0。 //如果函数执行失败,返回值为0。要得到扩展错误信息,调用GetLastError。 [DllImport("user32.dll", SetLastError =true)] publicstaticexternbool RegisterHotKey( IntPtr hWnd, //要定义热键的窗口的句柄 int id, //定义热键ID(不能与其它ID重复) KeyModifiers fsModifiers, //标识热键是否在按Alt、Ctrl、Shift、Windows等键时才会生效 Keys vk //定义热键的内容 ); [DllImport("user32.dll", SetLastError =true)] publicstaticexternbool UnregisterHotKey( IntPtr hWnd, //要取消热键的窗口的句柄 int id //要取消热键的ID ); //定义了辅助键的名称(将数字转变为字符以便于记忆,也可去除此枚举而直接使用数值) [Flags()] publicenum KeyModifiers { None =0, Alt =1, Ctrl =2, Shift =4, WindowsKey =8 } } } 简单说明一下: “publicstaticexternbool RegisterHotKey()”这个函数用于注册热键。由于这个函数需要引用user32.dll动态链接库后才能使用,并且 user32.dll是非托管代码,不能用命名空间的方式直接引用,所以需要用“DllImport”进行引入后才能使用。于是在函数前面需要加上 “[DllImport("user32.dll", SetLastError =true)]”这行语句。 “publicstaticexternbool UnregisterHotKey()”这个函数用于注销热键,同理也需要用DllImport引用user32.dll后才能使用。 “publicenum KeyModifiers{}”定义了一组枚举,将辅助键的数字代码直接表示为文字,以方便使用。这样在调用时我们不必记住每一个辅 助键的代码而只需直接选择其名称即可。 (2)以窗体FormA为例,介绍HotKey类的使用 在FormA的Activate事件中注册热键,本例中注册Shift+S,Ctrl+Z,Alt+D这三个热键。这里的Id号可任意设置,但要保证不被重复。 privatevoid Form_Activated(object sender, EventArgs e) { //注册热键Shift+S,Id号为100。HotKey.KeyModifiers.Shift也可以直接使用数字4来表示。 HotKey.RegisterHotKey(Handle, 100, HotKey.KeyModifiers.Shift, Keys.S); //注册热键Ctrl+B,Id号为101。HotKey.KeyModifiers.Ctrl也可以直接使用数字2来表示。 HotKey.RegisterHotKey(Handle, 101, HotKey.KeyModifiers.Ctrl, Keys.B); //注册热键Alt+D,Id号为102。HotKey.KeyModifiers.Alt也可以直接使用数字1来表示。 HotKey.RegisterHotKey(Handle, 102, HotKey.KeyModifiers.Alt, Keys.D); } 在FormA的Leave事件中注销热键。 privatevoid FrmSale_Leave(object sender, EventArgs e) { //注销Id号为100的热键设定 HotKey.UnregisterHotKey(Handle, 100); //注销Id号为101的热键设定 HotKey.UnregisterHotKey(Handle, 101);//http://ike.126.com //注销Id号为102的热键设定 HotKey.UnregisterHotKey(Handle, 102); } 重载FromA中的WndProc函数 ////// 监视Windows消息 /// 重载WndProc方法,用于实现热键响应 //////protectedoverridevoid WndProc(ref Message m) { constint WM_HOTKEY =0x0312;//如果m.Msg的值为0x0312那么表示用户按下了热键 //按快捷键 switch (m.Msg) { case WM_HOTKEY: switch (m.WParam.ToInt32()) { case100: //按下的是Shift+S //此处填写快捷键响应代码 break; case101: //按下的是Ctrl+B //此处填写快捷键响应代码 break; case102: //按下的是Alt+D //此处填写快捷键响应代码 break; } break; } base.WndProc(ref m); } |
相关文章推荐
- C# 如何实现热键注册 RegisterHotKey
- C# 如何实现热键注册 RegisterHotKey
- C# 如何实现热键注册 RegisterHotKey
- C# 如何实现热键注册 RegisterHotKey
- C#实现注册全局热键(register hot key)
- C#中调用API函数RegisterHotKey注册多个系统热键
- c#如何编写实现用户注册的控制台应用程序
- C#实现注册全局热键(register hot key)
- C#中调用API函数RegisterHotKey注册多个系统热键
- C#中调用API函数RegisterHotKey注册多个系统热键
- C#中调用API函数RegisterHotKey注册多个系统热键
- C#中调用API函数RegisterHotKey注册多个系统热键
- C#程序如何实现COM组件的自动注册
- 如何实现C# button定义热键
- C#中调用API函数RegisterHotKey注册多个系统热键
- C# 如何实现简单的Socket通信(附示例) 推荐
- C#基础视频教程5.2 如何编写简单的超级热键
- Windows Phone 8 学习志(探索问题一:如何简单利用Windows Phone Runtime Component项目类型实现C#和C++交互)
- C#在一台客户端进行了某个操作以后如何让其他不同的客户端如何实现相同的操作(三)