深入理解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类的使用在FormA的Activate事件中注册热键,本例中注册Shift+S,Ctrl+Z,Alt+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+S、Ctrl+B、Alt+D这三组快捷键中的任意一组时,程序都会做出响应的反应。

(0)

相关推荐

  • C#编程实现自定义热键的方法

    本文实例讲述了C#编程实现自定义热键的方法.分享给大家供大家参考.具体实现方法如下: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Drawing.Im

  • C#全局热键设置与窗体热键设置实例

    本文实例讲述了C#全局热键设置与窗体热键设置,分享给大家供大家参考.具体实现方法如下: 1.窗体热键 首先要设置主窗体KeyPreview为true,可直接在属性中进行设置, 或者在窗体加载中设置: this.KeyPreview = true; 然后添加窗体KeyDown事件,如下: 复制代码 代码如下: private void FrmMain_KeyDown(object sender, KeyEventArgs e) {     if (e.Alt && e.Shift &

  • c#使用热键实现程序窗口隐藏示例

    复制代码 代码如下: using System; using System.Text; using System.Collections; using System.Runtime.InteropServices; namespace WindowHider {     /// <summary>     /// Object used to control a Windows Form.     /// </summary>     public class Window    

  • C#自定义类型强制转换实例分析

    本文实例讲述了C#自定义类型强制转换的用法.分享给大家供大家参考.具体分析如下: 先来举一个小例子 类定义: public class MyCurrency { public uint Dollars; public ushort Cents; public MyCurrency(uint dollars, ushort cents) { this.Dollars = dollars; this.Cents = cents; } public override string ToString()

  • C#自定义签名章实现方法

    本文实例讲述了C#自定义签名章实现方法.分享给大家供大家参考.具体实现方法如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Drawing; using System.Drawing.Imaging; using System.Drawing.Drawing2D; namespace WfpApp { public class DrawCac

  • C#实现自定义windows系统日志的方法

    本文实例讲述了C#实现自定义windows系统日志的方法.分享给大家供大家参考.具体实现方法如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Diagnostics; namespace ConsoleApp { /// <summary> /// 系统日志 /// </summary> public class PackSys

  • C#通过热键控制显示器开关的方法

    本文实例讲述了C#通过热键控制显示器开关的方法.分享给大家供大家参考. 具体实现方法如下: 复制代码 代码如下: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using Sys

  • C#自定义事件及用法实例

    本文实例讲述了C#自定义事件及用法.分享给大家供大家参考.具体分析如下: 事件是C#中一个重要的内容,MSDN上有一个自定义事件的演示示例.我看了半天有点晕,所以新建了一个winform工程添加了一个按钮,然后找出调用的程序,一对比做了一个类似的示例,就明白了.看代码有时候比看文档来得更快. 所以还是一贯的原则,来干的,不来稀的. using System; namespace TestEventArgs { /// <summary> /// 这个类对应于EventArgs,做对比学习. /

  • C# 系统热键注册实现代码

    先引用using System.Runtime.InteropServices; 的命名空间, 然后在合适的位置加上如下代码就OK..注意:Form1_Load和Form1_FormClosed不能直接copy哦- 复制代码 代码如下: [DllImport("user32")] public static extern bool RegisterHotKey(IntPtr hWnd,int id,uint control,Keys vk ); //注册热键的api [DllImpor

  • 深入理解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{

  • 浅理解C++ 人脸识别系统的实现

    机器学习 机器学习的目的是把数据转换成信息. 机器学习通过从数据里提取规则或模式来把数据转成信息. 人脸识别 人脸识别通过级联分类器对特征的分级筛选来确定是否是人脸. 每个节点的正确识别率很高,但正确拒绝率很低. 任一节点判断没有人脸特征则结束运算,宣布不是人脸. 全部节点通过,则宣布是人脸. 工业上,常用人脸识别技术来识别物体. 基于深度学习的人脸识别系统,一共用到5个开源库:OpenCV(计算机视觉库).Caffe(深度学习库).Dlib(机器学习库).libfacedetection(人脸

  • 输入法的回车与消息发送快捷键回车的冲突解决方法

    问题:在中文输入法输入文字时按ENTER键:绑定keyup事件会将输入法中的英文文字输入到文字框并直接触发发送按钮 键盘事件: 当一个按键被pressed或者released,在每一个浏览器中都可能会触发三种键盘事件 keydown keypress keyup keydown事件发生在按键被按下的时候,接着触发keypress,松开按键的时候触发keyup事件 中文输入法: firfox:输入触发keydown,回车确认输入触发keyup chrome:输入触发keydown.keyup,回车

  • Mysql在Windows系统快速安装部署方法(绿色免安装版)

    首先下载MySQL的是绿色免安装版,放到随便一个文件夹也可以,这次我直接放在了C盘 步骤: 1.将my-default.ini(ini如果没有后缀就是my-default) 复制后改名为my.ini(ini如果没有后缀就是my),然后复制以下内容把原来的内容全替换掉 [mysql] default-character-set=utf8 [mysqld] #设置3306端口 port=3306 #系统基本目录 basedir=C:/mysql-5.6 #用户数据目录 datadir=C:/mysq

  • 有效学习Linux系统的4个方法

    总结4条对学习Linux系统有帮助的方法,具体内容如下 网络是一个很神奇的东西,现代人的生活离不开网络,网络已深入人们的工作,生活,娱乐等方方面面.网络之所以无处不在,是因为它提供了诸多的网络服务,所以网络服务是网络的灵魂. 互联网上的各种网络服务是架构在各种各样的服务器上的.服务器(Server)是提供网络服务的物理载体,是一种计算机,只不过它是一种功能更为强大的计算机,特别是在网络应用服务方面.在服务器中安装有操作系统,就如普通PC中安装有Windows 7,Windows 8或者Windo

  • Vue.set()实现数据动态响应的方法

    在vue里面,我们操作最多的就是各种数据,在jquery里面,我们习惯通过下标定向找到数据,然后重新赋值 比如var a[0]=111;(希望上家公司原谅菜鸟的我写了不少这样的代码

  • Android调用系统裁剪的实现方法

    Android调用系统裁剪,这个已经使用的很熟悉了.但是近期项目里使用的时候遇到了一些小问题,所以在此整理一下,以作记录. 首先看代码: Intent intent1 = new Intent("com.android.camera.action.CROP"); intent1.setDataAndType(Uri.fromFile(new File(image.path)), "image/*"); intent1.putExtra("crop"

  • Vue.js实现数据响应的方法

    许多前端JavaScript框架(例如Angular,React和Vue)都有自己的数据相应引擎.通过了解相应性及其工作原理,您可以提高开发技能并更有效地使用JavaScript框架.在视频和下面的文章中,我们构建了您在Vue源代码中看到的相同类型的Reactivity. 如果您观看此视频而不是阅读文章,请观看系列中的下一个视频,与Vue的创建者Evan You讨论反应性和代理.

  • access中显示MSysObjects系统表的设置方法

    默认access的系统表MSysObjects等是不显示的,需要手动设置access显示MSysObjects等系统表. 设置方法如下: 1. 打开Access 2. 点击"工具"菜单,选择"选项" 3. 在"视图"页上,将"系统对象"勾上 4. 点击"确定"按钮保存设置 5. 点击"工具"菜单,选择"安全"中的"用户与组权限" 6. 选择&quo

  • angular 用拦截器统一处理http请求和响应的方法

    想使用angularjs里的htpp向后台发送请求,现在有个用户唯一识别的token想要放到headers里面去,也就是{headres:{'token':1}} index.html里引入以下js: angular.module('app.factorys',[]) .factory('httpInterceptor',['$q','$injector','$localStorage',function ($q,$injector,$localStorage) { var httpInterc

随机推荐