C#热键- kenter自言自语- JavaEye技术网站

为自己的程序做热键呢(快捷键)比如按“Ctrl+A”会触发自己程序的某个事件呢?

?用:

private void Form1_KeyDown(object sender, KeyEventArgs e)   
{   
    if (e.Control && e.KeyCode == Keys.A)   
    {   
        btnTest_Click(this, EventArgs.Empty);   
    }   
}  

?

?

方法固然简单有效!但是有没有发现一个问题?那就是当程序失去焦点的时候这个热键(快捷键)就不管用了!那怎么办呢?其实办法还

是有的!又要用到Win32API了这次用:RegisterHotKey 和 UnregisterHotKey这2个函数的意思不需要我解释吧! 看表面意思

就知道了 注册热键和注销热键我们看看他们的生命方式

?

[DllImportAttribute("user32.dll", EntryPoint = "RegisterHotKey")]   
        public static extern bool RegisterHotKey   
            (   
                IntPtr hWnd,        //要注册热键的窗口句柄   
                int id,             //热键编号   
                int fsModifiers,    //特殊键如:Ctrl,Alt,Shift,Window   
                int vk              //一般键如:A B C F1,F2 等   
            );   
  
  
        [DllImportAttribute("user32.dll", EntryPoint = "UnregisterHotKey")]   
        public static extern bool UnregisterHotKey   
            (   
                IntPtr hWnd,        //注册热键的窗口句柄   
                int id              //热键编号上面注册热键的编号   
            );  

?

?

用RegisterHotKey注册的热键即时在失去焦点的情况下也可以有效!

所有实现代码如下:

?

using System;   
using System.ComponentModel;   
using System.Drawing;   
using System.Text;   
using System.Windows.Forms;   
  
using System.Runtime.InteropServices;   
  
namespace HotKeyTest   
{   
    public partial class Form1 : Form   
    {   
        public Form1()   
        {   
            InitializeComponent();   
        }   
  
        private enum MyKeys   
        {    
            None = 0,   
            Alt = 1,   
            Ctrl = 2,   
            Shift = 4,   
            Win = 8   
        }   
  
        const int WM_HOTKEY = 0x312;   
  
        private void Form1_Load(object sender, EventArgs e)   
        {   
            RegisterHotKey(this.Handle, 200, (int)MyKeys.Alt, (int)Keys.A); //注册热键Alt+A   
            //RegisterHotKey(this.Handle, 200,(int)MyKeys.Ctrl|(int)MyKeys.Alt, (int)Keys.A); 注册热键Ctrl+Alt+A   
            //RegisterHotKey(this.Handle, 200, (int)MyKeys.None, (int)Keys.F2); 注册热键F2   
        }   
  
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)   
        {   
            UnregisterHotKey(this.Handle, 200); //注销热键   
        }   
  
        private void btnTest_Click(object sender, EventArgs e)   
        {   
            MessageBox.Show("btnTest单击事件被触发!");   
        }   
  
        protected override void WndProc(ref Message m)   
        {   
            if (m.Msg == WM_HOTKEY)   
            {   
                switch (m.WParam.ToInt32())   
                {    
                    case 200:   
                        btnTest_Click(this, EventArgs.Empty);   
                        break;   
                }   
            }   
  
            base.WndProc(ref m);   
        }   
  
        [DllImportAttribute("user32.dll", EntryPoint = "RegisterHotKey")]   
        public static extern bool RegisterHotKey   
            (   
                IntPtr hWnd,        //要注册热键的窗口句柄   
                int id,             //热键编号   
                int fsModifiers,    //特殊键如:Ctrl,Alt,Shift,Window   
                int vk              //一般键如:A B C F1,F2 等   
            );   
  
        [DllImportAttribute("user32.dll", EntryPoint = "UnregisterHotKey")]   
        public static extern bool UnregisterHotKey   
            (   
                IntPtr hWnd,        //注册热键的窗口句柄   
                int id              //热键编号上面注册热键的编号   
            );   
    }   
}  

?

郑重声明:资讯 【C#热键- kenter自言自语- JavaEye技术网站】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——