C#实现快捷键(系统热键)响应 以及事件调用

在应用中,我们可能会需要实现像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)]
     
        public static extern bool RegisterHotKey(
     
            IntPtr hWnd,                //要定义热键的窗口的句柄 
            int id,                     //定义热键ID(不能与其它ID重复)            
            KeyModifiers fsModifiers,   //标识热键是否在按AltCtrlShiftWindows等键时才会生效 
            Keys vk                     //定义热键的内容 
            );
     

   
     
   
        [DllImport("user32.dll", SetLastError = true)]
     
        public static extern bool UnregisterHotKey(
     
            IntPtr hWnd,                //要取消热键的窗口的句柄 
            int id                      //要取消热键的ID 
            );
     

   
     
   
        //定义了辅助键的名称(将数字转变为字符以便于记忆,也可去除此枚举而直接使用数值) 
        [Flags()]
     
        public enum KeyModifiers
     
        {
     
            None = 0,
     
            Alt = 1,
     
            Ctrl = 2,
     
            Shift = 4,
     
            WindowsKey = 8
     
        }
     
    }
     
}
     

   
     
   
简单说明一下: 
public static extern bool RegisterHotKey()”这个函数用于注册热键。由于这个函数需要引用user32.dll动态链接库后才能使用,并且 

   
     
   
user32.dll是非托管代码,不能用命名空间的方式直接引用,所以需要用“DllImport”进行引入后才能使用。于是在函数前面需要加上 

   
     
   
“[DllImport("user32.dll", SetLastError = true)]”这行语句。 
public static extern bool UnregisterHotKey()”这个函数用于注销热键,同理也需要用DllImport引用user32.dll后才能使用。 
public enum KeyModifiers{}”定义了一组枚举,将辅助键的数字代码直接表示为文字,以方便使用。这样在调用时我们不必记住每一个辅 

   
     
   
助键的代码而只需直接选择其名称即可。 

   
     
   
2)以窗体FormA为例,介绍HotKey类的使用 

   
     
   
FormAActivate事件中注册热键,本例中注册Shift+SCtrl+ZAlt+D这三个热键。这里的Id号可任意设置,但要保证不被重复。 
private void Form_Activated(object sender, EventArgs e)
     
{
     
    //注册热键Shift+SId号为100HotKey.KeyModifiers.Shift也可以直接使用数字4来表示。 
    HotKey.RegisterHotKey(Handle, 100, HotKey.KeyModifiers.Shift, Keys.S); 
     
    //注册热键Ctrl+BId号为101HotKey.KeyModifiers.Ctrl也可以直接使用数字2来表示。 
    HotKey.RegisterHotKey(Handle, 101, HotKey.KeyModifiers.Ctrl, Keys.B);
     
    //注册热键Alt+DId号为102HotKey.KeyModifiers.Alt也可以直接使用数字1来表示。 
    HotKey.RegisterHotKey(Handle, 102, HotKey.KeyModifiers.Alt, Keys.D);
     
}
     

   
     
   
FormALeave事件中注销热键。 
private void FrmSale_Leave(object sender, EventArgs e)
     
{
     
    //注销Id号为100的热键设定 
    HotKey.UnregisterHotKey(Handle, 100);
     
    //注销Id号为101的热键设定 
    HotKey.UnregisterHotKey(Handle, 101);
    //注销Id号为102的热键设定 
    HotKey.UnregisterHotKey(Handle, 102);
     
}
     

   
     
   
重载FromA中的WndProc函数 
/// 
     
/// 监视Windows消息 
/// 重载WndProc方法,用于实现热键响应 
/// 
     
/// 
     
protected override void WndProc(ref Message m)
     
{
     
    const int WM_HOTKEY = 0x0312;
     
    //按快捷键 
    switch (m.Msg)
     
    {
     
        case WM_HOTKEY:
     
            switch (m.WParam.ToInt32())
     
            {
     
                case 100:    //按下的是Shift+S 
                    btnSend_Click(this,new  EventArgs());//调用按钮单击事件          
                    break;
     
                case 101:    //按下的是Ctrl+B 
                    //此处填写快捷键响应代码 
                    break;
     
                case 102:    //按下的是Alt+D 
                    //此处填写快捷键响应代码 
                    break;
     
            }
     
        break;
     
    }
     
    base.WndProc(ref m);
     
}
     

   
     
   
完成代码后,我们在窗体中按下Shift+SCtrl+BAlt+D这三组快捷键中的任意一组时,程序都会做出响应的反应。 

你可能感兴趣的:(快捷键,C#,休闲,系统热键,事件调用)