C# 注册 Windows 热键

原文:C# 注册 Windows 热键

闲扯:

  前几日,一个朋友问我如何实现按 F1 键实现粘贴(Ctrl+V)功能,百度了一个方法,发给他,他看不懂(已经是 Boss 的曾经的码农),我就做了个Demo给他参考。今日得空,将 Demo 整理一下,做为收集,也给大家一个参考。

 

Begin:

  注册系统热键,.net 类库好像没有提供现成的方法,需要使用系统提供的 DLL。

  微软将许多常用的系统函数都封装在 user32.dll 中,注册系统热键使用到的 RegisterHotKey 函数和 UnregisterHotKey 函数也在该 DLL 文件中,所以我们需要将这两个方法映射到 C# 类中。下面代码封装了这两个方法,并做一些简单的封装,如下:

 1 using System;
 2 using System.Text;
 3 using System.Runtime.InteropServices;
 4 using System.Windows.Forms;
 5
 6 public class SystemHotKey
 7 {
 8     /// <summary>
 9     /// 如果函数执行成功,返回值不为0。
10     /// 如果函数执行失败,返回值为0。要得到扩展错误信息,调用GetLastError。
11     /// </summary>
12     /// <param name="hWnd">要定义热键的窗口的句柄</param>
13     /// <param name="id">定义热键ID(不能与其它ID重复)</param>
14     /// <param name="fsModifiers">标识热键是否在按Alt、Ctrl、Shift、Windows等键时才会生效</param>
15     /// <param name="vk">定义热键的内容</param>
16     /// <returns></returns>
17     [DllImport("user32.dll", SetLastError = true)]
18     public static extern bool RegisterHotKey(IntPtr hWnd, int id, KeyModifiers fsModifiers, Keys vk);
19
20     /// <summary>
21     /// 注销热键
22     /// </summary>
23     /// <param name="hWnd">要取消热键的窗口的句柄</param>
24     /// <param name="id">要取消热键的ID</param>
25     /// <returns></returns>
26     [DllImport("user32.dll", SetLastError = true)]
27     public static extern bool UnregisterHotKey(IntPtr hWnd, int id);
28
29     /// <summary>
30     /// 辅助键名称。
31     /// Alt, Ctrl, Shift, WindowsKey
32     /// </summary>
33     [Flags()]
34     public enum KeyModifiers { None = 0, Alt = 1, Ctrl = 2, Shift = 4, WindowsKey = 8 }
35
36     /// <summary>
37     /// 注册热键
38     /// </summary>
39     /// <param name="hwnd">窗口句柄</param>
40     /// <param name="hotKey_id">热键ID</param>
41     /// <param name="keyModifiers">组合键</param>
42     /// <param name="key">热键</param>
43     public static void RegHotKey(IntPtr hwnd, int hotKeyId, KeyModifiers keyModifiers, Keys key)
44     {
45         if (!RegisterHotKey(hwnd, hotKeyId, keyModifiers, key))
46         {
47             int errorCode = Marshal.GetLastWin32Error();
48             if (errorCode == 1409)
49             {
50                 MessageBox.Show("热键被占用 !");
51             }
52             else
53             {
54                 MessageBox.Show("注册热键失败!错误代码:" + errorCode);
55             }
56         }
57     }
58
59     /// <summary>
60     /// 注销热键
61     /// </summary>
62     /// <param name="hwnd">窗口句柄</param>
63     /// <param name="hotKey_id">热键ID</param>
64     public static void UnRegHotKey(IntPtr hwnd, int hotKeyId)
65     {
66         //注销指定的热键
67         UnregisterHotKey(hwnd, hotKeyId);
68     }
69
70 }

  (这个类是网上搜到的,这里借用一下。。。在此对原作者表示感谢!)

  上面这个类中,只需要使用两个静态方法 RegHotKey 和 UnRegHotKey 来注册和注销热键即可。

  这里有一点需要注意一下:这两个方法需要一个窗口的句柄来绑定系统热键消息,也就是说,当用户按下注册过的热键以后,系统会将按键消息发送给指定窗口。

  RegHotKey 方法有四个参数,第一个是窗口句柄,第二个是自定义的热键ID,第三个是组合键,比如Ctrl、Alt、Shift等,如果没有,就是None,第四个就是指定的热键了。

  UnRegHotKey 方法只需要窗口句柄和热键ID,就可以将该热键注销。

 

  然后,创建一个窗体,在代码视图中添加如下代码:

        private const int WM_HOTKEY = 0x312; //窗口消息:热键
        private const int WM_CREATE = 0x1; //窗口消息:创建
        private const int WM_DESTROY = 0x2; //窗口消息:销毁

        private const int HotKeyID = 1; //热键ID(自定义)

        protected override void WndProc(ref Message msg)
        {
            base.WndProc(ref msg);
            switch (msg.Msg)
            {
                case WM_HOTKEY: //窗口消息:热键
                    int tmpWParam = msg.WParam.ToInt32();
                    if (tmpWParam == HotKeyID)
                    {
                        System.Windows.Forms.SendKeys.Send("^v");
                    }
                    break;
                case WM_CREATE: //窗口消息:创建
                    SystemHotKey.RegHotKey(this.Handle, HotKeyID, SystemHotKey.KeyModifiers.None, Keys.F1);
                    break;
                case WM_DESTROY: //窗口消息:销毁
                    SystemHotKey.UnRegHotKey(this.Handle, HotKeyID); //销毁热键
                    break;
                default:
                    break;
            }
        }

  在上面代码中,WM_HOTKEY、WM_CREATE、WM_DESTROY 三个常量的值是系统定义,不用关心。HotKeyID 是自定义的一个数值,用于在注册了多个热键的时候使用该数值来区分不同热键处理逻辑,系统会在用户触发热键时将该值做为参数传递给处理程序。

  另外,上面代码中重写了一个系统方法 WndProc,这个方法叫“窗口过程”(参考百度百科),用于接收处理注册到该窗体上的所有事件,包括窗体创建、窗体销毁、系统热键等等。该方法有一个 Message 结构体参数,该参数封装了 Windows 消息的一些基本属性,比如消息ID、参数等等。

  上面代码在该方法接收到窗口创建消息的时候注册热键 F1,并且在接收到窗口销毁消息的时候注销该热键,并且在接收到系统热键消息的时候,根据消息参数(热键ID)来确认触发我们想要的动作,比如这里的模拟用户按下 Ctrl+V 键。

 

  最后,运行该程序,就可以在任意应用程序里使用 F1 键完成 Ctrl+V 的效果了。

 

时间: 2024-10-21 15:19:48

C# 注册 Windows 热键的相关文章

Windows热键注册原理

要像系统注册一个全局热键,需要用到RegisterHotKey,函数用法如下(MSDN):BOOLRegisterHotKey(HWNDhWnd,intid,UINTfsModifiers,UINTvk);函数功能:该函数定义一个系统范围的热键. 函数原型:BOOLRegisterHotKey(HWNDhWnd,intid,UINTfsModifiers,UINTvk): 参数: hWnd:接收热键产生WM_HOTKEY消息的窗口句柄.若该参数NULL,传递给调用线程的WM_HOTKEY消息必须

[Windows Phone]解锁、注册Windows Phone实体手机为开发机(Windows 8)

原文:[Windows Phone]解锁.注册Windows Phone实体手机为开发机(Windows 8) 前言 ? ? 最近要开发Windows Phone(以下简称WP)的手机游戏,由於使用模拟器实在有些慢,加上装在实体手机上运行会比较有感觉,所以便购买了一只Lumia 920来做为开发机,但是当我要开始把开发的程式Port到实体手机时,却遇到了「无法连接到手机,因为该装置处於开发人员锁定状态....」等讯息! ? 究竟是怎麽回事呢? 要如何解决呢? 其实我们需要对手机做一个注册的动作.

在win7系统下用JIntellitype注册的热键用来切换多个disktop不起作用

问题描述 在win7系统下用JIntellitype注册的热键用来切换多个disktop不起作用,但在xp和2003里都能切换,是怎么回事?

注册Windows Phone Marketplace经验

简介 经过漫长漫长的等待以后,终于注册成功Windows Phone Marketplace,把经 验分享一下. 登记注册 打开https://windowsphone.create.msdn.com/Register/ ,使用live id (msn id)登陆,然后按照向导一步步注册. 选择帐号类型,公司账户,个人账户,或者学生账户.学生账户是不需要花 钱的.

WinXP系统如何注册Windows Live ID

  1.因为Live ID通用的,所以在很地方都有注册的入口的.比如我们可以直接打开cn.msn.com: 2.点击右上角的"登录"链接,如上图; 在打开的登录帐户窗口中点击"注册"按钮: 3.在打开注册窗口中,输入较完整的个人信息: 4.所有信息和验证码输入完毕后点击"接受"按钮继续: 5.如果你的信息验证无误后,可能会弹出如下图所示的"安全警告": 6.直接点击"是"按钮即可. 一会无任何提示的注册完毕

C#中调用API函数RegisterHotKey注册多个系统热键

函数 要设置快捷键必须使用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.dllusing System;us

C# 系统热键注册实现代码_C#教程

先引用using System.Runtime.InteropServices; 的命名空间, 然后在合适的位置加上如下代码就OK..注意:Form1_Load和Form1_FormClosed不能直接copy哦- 复制代码 代码如下: [DllImport("user32")] public static extern bool RegisterHotKey(IntPtr hWnd,int id,uint control,Keys vk ); //注册热键的api [DllImpor

使用VB在应用程序中注册热键

程序 '窗体中Option Explicit Private Sub Form_Load()Dim ret As Long '记录原来的window程序地址 preWinProc = GetWindowLong(Me.hWnd, GWL_WNDPROC) '用自定义程序代替原来的window程序 ret = SetWindowLong(Me.hWnd, GWL_WNDPROC, AddressOf wndproc) idHotKey = 1 'in the range &h0000 throug

在Visual C#程序中使用系统热键

1.首先引入System.Runtime.InteropServices using System.Runtime.InteropServices; 2.在类内部声明两个API函数,它们的位置和类的成员变量等同. [System.Runtime.InteropServices.DllImport("user32.dll")] //申明API函数 public static extern bool RegisterHotKey( IntPtr hWnd, // handle to win