WINFROM自定义热键

先定义一个热键类

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

namespace ExcelReportDesigner
{
    class WinHotKey
    {
        public WinHotKey()
        {

        }
        //如果函数执行成功,返回值不为0。        
        //如果函数执行失败,返回值为0。要得到扩展错误信息,调用GetLastError。
        [DllImport("user32.dll", SetLastError = true)]
        public static extern bool RegisterHotKey(
              IntPtr hWnd,  //要定义热键的窗口的句柄
              int id, //定义热键ID(不能与其它ID重复)
              KeyModifiers fsModifiers,//标识热键是否在按Alt、Ctrl、Shift、Windows等键时才会生效
              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,
            Control = 2,
            Shift = 4,
            Windows = 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使用方法:

 private void frmMain_Load(object sender, EventArgs e)
        {

   //注册热键Ctrl+S,Id号为100。HotKey.KeyModifiers.Ctrl也可以直接使用数字2来表示。
            WinHotKey.RegisterHotKey(Handle, 100, WinHotKey.KeyModifiers.Control, Keys.S);

}

  private void frmSpreadsheet_FormClosing(object sender, FormClosingEventArgs e)
        {
            WinHotKey.UnregisterHotKey(Handle, 100);
        }

需要在使用的From重写WndProc方法

  protected override void WndProc(ref Message msg)
        {
            const int WM_HOTKEY = 0x0312;    //按快捷键     
            if (msg.Msg == WM_HOTKEY)
            {
                switch (msg.WParam.ToInt32())
                {
                    case 100:    //按下的是Shift+S                     
                        try
                        {
                            axSpreadsheet.Export(filePath, SheetExportActionEnum.ssExportActionNone,
                                  SheetExportFormat.ssExportAsAppropriate);
                        }
                        catch (Exception ex)
                        {
                            MessageBox.Show("保存失败!", "错误提示!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }
                        break;
                    case 101:    //按下的是Ctrl+B                                 
                        break;
                    case 102:    //按下的是Alt+D                                     
                        break;
                }
            }
            base.WndProc(ref msg);
        }

posted @ 2008-12-25 16:56  温景良(Jason)  Views(554)  Comments(2Edit  收藏  举报