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,    //标识热键是否在按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,

             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+S,Id号为100。HotKey.KeyModifiers.Shift也可以直接使用数字4来表示。

    HotKey.RegisterHotKey(Handle, 100, HotKey.KeyModifiers.Shift, Keys.S);

    //注册热键Ctrl+B,Id号为101。HotKey.KeyModifiers.Ctrl也可以直接使用数字2来表示。

    HotKey.RegisterHotKey(Handle, 101, HotKey.KeyModifiers.Ctrl, Keys.B);

    //注册热键Alt+D,Id号为102。HotKey.KeyModifiers.Alt也可以直接使用数字1来表示。

    HotKey.RegisterHotKey(Handle, 102, HotKey.KeyModifiers.Alt, Keys.D);

}

//在FormA的Leave事件中注销热键。

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
                     //
此处填写快捷键响应代码        
                     break;
                 case 101:     //
按下的是Ctrl+B
                     //
此处填写快捷键响应代码
                     break;
                 case 102:     //
按下的是Alt+D
                     //
此处填写快捷键响应代码
                     break;
             }
         break;
     }
     base.WndProc(ref m);
}

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


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/ismycxp/archive/2007/07/19/1698942.aspx

附上一个注册热键的类

用其他朋友的整理的,出处作者不明。

 

using System.Runtime.InteropServices;
using System;
using System.Windows.Forms;
using System.Collections.Generic;
namespace AFLib.Base
{
    public delegate void HotKeyCallBackHanlder();
    /// <summary>
    /// 使用步骤:
    /// 1、在窗体加载时,使用Regist注册热键
    /// 2、重载WndProc方法,使用ProcessHotKey,用于实现热键响应。   
    /// base.WndProc(ref m);
    /// Hotkey.ProcessHotKey(m);
    /// 3、在窗体关闭时,必须使用UnRegist注销热键。
    /// </summary>
    public class Hotkey
    {
        #region 系统api
        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool RegisterHotKey(IntPtr hWnd, int id, HotkeyModifiers fsModifiers, Keys vk);

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

        [System.Runtime.InteropServices.DllImport("user32.dll")] //申明API函数 
        public static extern bool RegisterHotKey(
        IntPtr hWnd, // handle to window 
        int id, // hot key identifier 
        uint fsModifiers, // key-modifier options 
        Keys vk // virtual-key code 
        );

        #endregion

        const int WM_HOTKEY = 0x312;
        static int keyid = 10;
        static Dictionary<int, HotKeyCallBackHanlder> keymap = new Dictionary<int, HotKeyCallBackHanlder>();

        /// <summary> 
        /// 注册快捷键 
        /// </summary> 
        /// <param name="hWnd">持有快捷键窗口的句柄</param> 
        /// <param name="fsModifiers">组合键</param> 
        /// <param name="vk">快捷键的虚拟键码</param> 
        /// <param name="callBack">回调函数</param> 
        public static void Regist(IntPtr hWnd, HotkeyModifiers fsModifiers, Keys vk, HotKeyCallBackHanlder callBack)
        {
            int id = keyid++;
            if (!RegisterHotKey(hWnd, id, fsModifiers, vk))
                MessageBox.Show("暂时热键不可用!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            keymap[id] = callBack;
        }

        public static void Regist(IntPtr hWnd, uint fsModifiers, Keys vk, HotKeyCallBackHanlder callBack)
        {
            int id = keyid++;
            if (!RegisterHotKey(hWnd, id, fsModifiers, vk))
                MessageBox.Show("暂时热键不可用!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            keymap[id] = callBack;
        }

        /// <summary> 
        /// 注销快捷键 
        /// </summary> 
        /// <param name="hWnd">持有快捷键窗口的句柄</param> 
        /// <param name="callBack">回调函数</param> 
        public static void UnRegist(IntPtr hWnd, HotKeyCallBackHanlder callBack)
        {
            foreach (KeyValuePair<int, HotKeyCallBackHanlder> var in keymap)
            {
                if (var.Value == callBack)
                    UnregisterHotKey(hWnd, var.Key);
            }
        }

        /// <summary> 
        /// 快捷键消息处理 
        /// </summary> 
        public static void ProcessHotKey(System.Windows.Forms.Message m)
        {
            if (m.Msg == WM_HOTKEY)
            {
                int id = m.WParam.ToInt32();
                HotKeyCallBackHanlder callback;
                if (keymap.TryGetValue(id, out callback))
                {
                    callback();
                }
            }
        }

        /// <summary>
        /// 将字符转换为键值,如果转换失败,则返回指定的值
        /// </summary>
        /// <param name="s"></param>
        /// <returns></returns>
        public static Keys ParseToKey(string s, Keys key)
        {
            try
            {
                Keys k = (Keys)Enum.Parse(typeof(Keys), s.ToUpper());
                return k;
            }
            catch
            {
                return key;
            }
        }
    }

    public enum HotkeyModifiers
    {
        MOD_None = 0x0,
        MOD_Alt = 0x1,
        MOD_Ctrl = 0x2,
        MOD_Shift = 0x4,
        MOD_WindowsKey = 0x8
    }
}

 


本文转自火地晋博客园博客,原文链接:http://www.cnblogs.com/yelaiju/archive/2010/08/26/1808760.html,如需转载请自行联系原作者

目录
相关文章
|
存储 监控 算法
基于 C# 时间轮算法的控制局域网上网时间与实践应用
在数字化办公与教育环境中,局域网作为内部网络通信的核心基础设施,其精细化管理水平直接影响网络资源的合理配置与使用效能。对局域网用户上网时间的有效管控,已成为企业、教育机构等组织的重要管理需求。这一需求不仅旨在提升员工工作效率、规范学生网络使用行为,更是优化网络带宽资源分配的关键举措。时间轮算法作为一种经典的定时任务管理机制,在局域网用户上网时间管控场景中展现出显著的技术优势。本文将系统阐述时间轮算法的核心原理,并基于 C# 编程语言提供具体实现方案,以期深入剖析该算法在局域网管理中的应用逻辑与实践价值。
292 5
C#||应用框体设计计算器
C#||应用框体设计计算器
185 0
|
存储 安全 物联网
C# 在物联网 (IoT) 应用中的应用
本文介绍了C#在物联网(IoT)应用中的应用,涵盖基础概念、优势、常见问题及其解决方法。重点讨论了网络通信、数据处理和安全问题,并提供了相应的代码示例,旨在帮助开发者更好地利用C#进行IoT开发。
711 3
|
编译器 C#
c# - 运算符<<不能应用于long和long类型的操作数
在C#中,左移运算符的第二个操作数必须是 `int`类型,因此需要将 `long`类型的位移计数显式转换为 `int`类型。这种转换需要注意数据丢失和负值处理的问题。通过本文的详细说明和示例代码,相信可以帮助你在实际开发中正确使用左移运算符。
248 3
|
编译器 C#
c# - 运算符<<不能应用于long和long类型的操作数
在C#中,左移运算符的第二个操作数必须是 `int`类型,因此需要将 `long`类型的位移计数显式转换为 `int`类型。这种转换需要注意数据丢失和负值处理的问题。通过本文的详细说明和示例代码,相信可以帮助你在实际开发中正确使用左移运算符。
392 2
|
编译器 C# Android开发
Uno Platform 是一个用于构建跨平台应用程序的强大框架,它允许开发者使用 C# 和 XAML 来创建适用于多个平台的应用
Uno Platform 是一个用于构建跨平台应用程序的强大框架,它允许开发者使用 C# 和 XAML 来创建适用于多个平台的应用
868 8
|
存储 C# 开发者
枚举与结构体的应用:C#中的数据组织艺术
在C#编程中,枚举(`enum`)和结构体(`struct`)是非常重要的数据类型。枚举用于定义命名常量集合,提高代码可读性;结构体则封装相关数据字段,适合小型数据集。本文从基本概念入手,探讨它们的使用技巧、常见问题及解决方案,帮助开发者更好地利用这些特性构建健壮的应用程序。
270 9
|
设计模式 开发框架 前端开发
MVC 模式在 C# 中的应用
MVC(Model-View-Controller)模式是广泛应用于Web应用程序开发的设计模式,将应用分为模型(存储数据及逻辑)、视图(展示数据给用户)和控制器(处理用户输入并控制模型与视图交互)三部分,有助于管理复杂应用并提高代码可读性和维护性。在C#中,ASP.NET MVC框架常用于构建基于MVC模式的Web应用,通过定义模型、控制器和视图,实现结构清晰且易维护的应用程序。
354 2
|
C#
C# 一分钟浅谈:循环结构 for 和 while 的应用
【9月更文挑战第1天】循环结构是编程中的基础概念,C# 中常用的 `for` 和 `while` 循环允许重复执行代码直至满足特定条件。`for` 循环基于计数,适用于已知循环次数的情况;`while` 循环基于条件,适用于未知循环次数的情况;`do-while` 循环则至少执行一次循环体。本文详细介绍了这些循环的语法和示例,并探讨了常见问题及其解决方法,如循环条件和更新表达式的错误设置。通过综合应用示例(如计算阶乘和斐波那契数列),帮助读者更好地理解和掌握循环结构的使用方法。正确使用循环可以提高程序的效率和可读性。
528 2
|
开发框架 前端开发 .NET
LIMS(实验室)信息管理系统源码、有哪些应用领域?采用C# ASP.NET dotnet 3.5 开发的一套实验室信息系统源码
集成于VS 2019,EXT.NET前端和ASP.NET后端,搭配MSSQL 2018数据库。系统覆盖样品管理、数据分析、报表和项目管理等实验室全流程。应用广泛,包括生产质检(如石化、制药)、环保监测、试验研究等领域。随着技术发展,现代LIMS还融合了临床、电子实验室笔记本和SaaS等功能,以满足复杂多样的实验室管理需求。
355 3
LIMS(实验室)信息管理系统源码、有哪些应用领域?采用C# ASP.NET dotnet 3.5 开发的一套实验室信息系统源码