给程序设置老板键

 一,首先是添加一个静态类,里面处理与HotKey有关的函数。

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace WTest26
{
    public static class HotKey
    {
        [DllImport("user32.dll")]
        private static extern int RegisterHotKey(IntPtr hwnd, int id, int fsModifiers, int vk);
        [DllImport("user32.dll")]
        private static extern int UnregisterHotKey(IntPtr hwnd, int id);

        public const int WM_HOTKEY = 0x312; //窗口消息-热键
        public const int WM_CREATE = 0x1; //窗口消息-创建
        public const int WM_DESTROY = 0x2; //窗口消息-销毁
        public const int MOD_ALT = 0x1; //ALT
        public const int MOD_CONTROL = 0x2; //CTRL
        public const int MOD_SHIFT = 0x4; //SHIFT
        public const int VK_SPACE = 0x20; //SPACE

        /// <summary>
        /// 注册热键
        /// </summary>
        /// <param name="hwnd">窗口句柄</param>
        /// <param name="hotKey_id">热键ID</param>
        /// <param name="fsModifiers">组合键</param>
        /// <param name="vk">热键</param>
        public static void RegKey(IntPtr hwnd, int hotKey_id, int fsModifiers, int vk)
        {
            bool result;
            if (RegisterHotKey(hwnd, hotKey_id, fsModifiers, vk) == 0)
            {
                result = false;
            }
            else
            {
                result = true;
            }
            if (!result)
            {
                MessageBox.Show("注册热键失败!");
            }
        }

        /// <summary>
        /// 注销热键
        /// </summary>
        /// <param name="hwnd">窗口句柄</param>
        /// <param name="hotKey_id">热键ID</param>
        public static void UnRegKey(IntPtr hwnd, int hotKey_id)
        {
            UnregisterHotKey(hwnd, hotKey_id);
        }
    }

注意:

一定要理解注册时使用的4个参数的根据。
后面两个参数好理解一个是Ctrl,Shift,Alt这些功能键是否处理,一个是按下的其它非功能键,比如ABCD之类的。
对于注册时使用的第1个参数,handler这是你用于接收热键消息的窗口句柄,这个固定。
第2个参数是热键的编号,它不一定要等于你要注册的热键的VK码,可以是其它值,只要不与现有的热键编号相同或者冲突即可。否则会导致已有的热键不可用
二,然后是使用上述代码
namespace WTest26
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }        private const int VK_F1 = 112;
        private const int VK_F2 = 113;        protected override void WndProc(ref Message m)
        {
            base.WndProc(ref m);
            switch (m.Msg)
            {
                case HotKey.WM_HOTKEY: //窗口消息-热键
                    switch (m.WParam.ToInt32())
                    {
                        case VK_F1:         //隐藏热键ID
                            this.Hide();
                            break;
                        case VK_F2:         //显示热键ID
                            this.Show();
                            break;
                        default:
                            break;
                    }
                    break;
                case HotKey.WM_CREATE: //窗口消息-创建
                    //注册Ctrl+F1                   
                    HotKey.RegKey(Handle, VK_F1, HotKey.MOD_CONTROL,VK_F1);
                    HotKey.RegKey(Handle, VK_F2, HotKey.MOD_CONTROL,VK_F2);
                    break;
                case HotKey.WM_DESTROY: //窗口消息-销毁                   
                    HotKey.UnRegKey(Handle, VK_F1);
                    HotKey.UnRegKey(Handle, VK_F2);
                    break;
                default:
                    break;
            }
        }
    }
}说明一下: VK_F1 = 112;并不是Ctrl+F1的键值,而是F1的VK(VirtualKey)值.这个值是固定的(具体的内容可以查MSDN). Ctrl,Shift,Alt这些功能键也有键值,但在这里不需要考虑

.因此从你那的编码的角度,如果你要用shift+ctrl+F1,你需要这样调用: HotKey.RegKey(Handle, VK_F1, HotKey.MOD_CONTROL|HotKey.Mod_SHIFT,VK_F1); 最后面那个参数就是F1

的键值,而前面表示需要组合按下Ctrl,Shift. 另外再提醒一次,第二个参数是表示你的程序在系统里注册热键时所使用的一个"编号",与你使用的热键具体是哪个没有任何关系,你

所唯一需要保证或者说需要注意的就是不要与其它全局热键冲突,否则会导致之前使用这个"编号"的热键失效,也就是你的这个注册覆盖了它之前的注册. 此文主要参考了phy的文章

,特此感谢!

 

 

你可能感兴趣的:(user,Class)