博客园  :: 首页  :: 新随笔  :: 联系 :: 管理

C# 实现系统热键盘注册的类

Posted on 2009-07-30 16:58  codingsilence  阅读(230)  评论(0编辑  收藏  举报

使用方法

  private RegisterHotKeyClass _RegisKey = new RegisterHotKeyClass();
        private void Form2_Load(object sender, EventArgs e)
        {
            _RegisKey.Keys = Keys.Q;
            _RegisKey.ModKey = RegisterHotKeyClass.MODKEY.MOD_CONTROL | RegisterHotKeyClass.MODKEY.MOD_ALT;
            _RegisKey.WindowHandle = this.Handle;
            _RegisKey.HotKey += new RegisterHotKeyClass.HotKeyPass(_Regis_HotKey);
            _RegisKey.StarHotKey();
           
        }

        void _Regis_HotKey()
        {
            MessageBox.Show("ok");
        }

这里注册的是 CTRL+ALT+Q

 

PS 补充:

要实现注册多个热键:

  private RegisterHotKeyClass _RegisKey2 = new RegisterHotKeyClass();
        private void Form2_Load()
        {
            _RegisKey2.m_WParam = 10001;
            _RegisKey2.Keys = Keys.E;
            _RegisKey2.ModKey = RegisterHotKeyClass.MODKEY.MOD_CONTROL;
            //| RegisterHotKeyClass.MODKEY.MOD_ALT
            _RegisKey2.WindowHandle = this.Handle;
            _RegisKey2.HotKey += new RegisterHotKeyClass.HotKeyPass(_Regis_HotKey);
            _RegisKey2.StarHotKey();

 

        }
        private RegisterHotKeyClass _RegisKey3 = new RegisterHotKeyClass();
        private void Form3_Load()
        {
            _RegisKey3.m_WParam = 10002;
            _RegisKey3.Keys = Keys.Q;
            _RegisKey3.ModKey = RegisterHotKeyClass.MODKEY.MOD_CONTROL;
            //| RegisterHotKeyClass.MODKEY.MOD_ALT
            _RegisKey3.WindowHandle = this.Handle;
            _RegisKey3.HotKey += new RegisterHotKeyClass.HotKeyPass(_Regis_HotKey2);
            _RegisKey3.StarHotKey();

        }

 

实例化多个注册类,并且要重置热键的ID。

 

下面是全部的类

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace RegisterHotKey
{
    /// <summary>
    /// 系统热键注册
    /// </summary>
    public class RegisterHotKeyClass
    {
        private IntPtr m_WindowHandle = IntPtr.Zero;
        private MODKEY m_ModKey = MODKEY.MOD_CONTROL;
        private Keys m_Keys = Keys.A;
        public int m_WParam = 10000;
        private bool Star = false;
        private HotKeyWndProc m_HotKeyWnd = new HotKeyWndProc();

        public IntPtr WindowHandle
        {
            get { return m_WindowHandle; }
            set { if (Star)return; m_WindowHandle = value; }
        }
        public MODKEY ModKey
        {
            get { return m_ModKey; }
            set { if (Star)return; m_ModKey = value; }
        }
        public Keys Keys
        {
            get { return m_Keys; }
            set { if (Star)return; m_Keys = value; }
        }
        public int WParam
        {
            get { return m_WParam; }
            set { if (Star)return; m_WParam = value; }
        }

        public void StarHotKey()
        {
            if (m_WindowHandle != IntPtr.Zero)
            {
                if (!RegisterHotKey(m_WindowHandle, m_WParam, m_ModKey, m_Keys))
                {
                    throw new Exception("注册失败!");
                }
                try
                {
                    m_HotKeyWnd.m_HotKeyPass = new HotKeyPass(KeyPass);
                    m_HotKeyWnd.m_WParam = m_WParam;
                    m_HotKeyWnd.AssignHandle(m_WindowHandle);
                    Star = true;
                }
                catch
                {
                    StopHotKey();
                }
            }
        }
        private void KeyPass()
        {
            if (HotKey != null) HotKey();
        }
        public void StopHotKey()
        {
            if (Star)
            {
                if (!UnregisterHotKey(m_WindowHandle, m_WParam))
                {
                    throw new Exception("卸载失败!");
                }
                Star = false;
                m_HotKeyWnd.ReleaseHandle();
            }
        }


        public delegate void HotKeyPass();
        public event HotKeyPass HotKey;


        private class HotKeyWndProc : NativeWindow
        {
            public int m_WParam = 10000;
            public HotKeyPass m_HotKeyPass;
            protected override void WndProc(ref Message m)
            {
                if (m.Msg == 0x0312 && m.WParam.ToInt32() == m_WParam)
                {
                    if (m_HotKeyPass != null) m_HotKeyPass.Invoke();
                }

                base.WndProc(ref m);
            }
        }

        public enum MODKEY
        {
            MOD_ALT = 0x0001,
            MOD_CONTROL = 0x0002,
            MOD_SHIFT = 0x0004,
            MOD_WIN = 0x0008,
        }

        [DllImport("user32.dll")]
        public static extern bool RegisterHotKey(IntPtr wnd, int id, MODKEY mode, Keys vk);

        [DllImport("user32.dll")]
        public static extern bool UnregisterHotKey(IntPtr wnd, int id);

    }

}