• 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);
            }
    
    
    版权说明

      如果标题未标有<转载、转>等字则属于作者原创,欢迎转载,其版权归作者和博客园共有。
      作      者:温景良
      文章出处:http://wenjl520.cnblogs.com/  或  http://www.cnblogs.com/

  • 相关阅读:
    HDU 3549 基础网络流EK算法 Flow Problem
    HDU 1937 F
    HDU 1937 J
    HDU 1939 HE IS OFFSIDE
    HDU 3033 组合背包变形 I love sneakers!
    分组背包
    hdu1712 分组背包 ACboy needs your help
    hdu 1714 RedField
    HDU 1709 母函数天平问题 可出现减法的情况 The Balance
    HDU 1171 Big Event in HDU 母函数
  • 原文地址:https://www.cnblogs.com/wenjl520/p/1362437.html
Copyright © 2020-2023  润新知