当前位置:  编程技术>.net/c#/asp.net

深入理解C#实现快捷键(系统热键)响应的方法

    来源: 互联网  发布时间:2014-10-21

    本文导语:  在应用中,我们可能会需要实现像Ctrl+C复制、Ctrl+V粘贴这样的快捷键,本文简单介绍了它的实现,并给出了一个实现类。(1)建立一个类文件,命名为HotKey.cs,代码如下: 代码如下:using System;using System.Collections.Generic;using Syste...

在应用中,我们可能会需要实现像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这三组快捷键中的任意一组时,程序都会做出响应的反应。

    
 
 

您可能感兴趣的文章:

  • 深入C#任务管理器中应用程序选项隐藏程序本身的方法详解
  • 深入C# 内存管理以及优化的方法详解
  • 深入c# Func委托的详解
  • C# 多态性的深入理解
  • 深入C#中使用SqlDbType.Xml类型参数的使用详解
  • 深入C# winform清除由GDI绘制出来的所有线条或图形的解决方法
  • 深入Unix时间戳与C# DateTime时间类型互换的详解
  • C# interface与delegate效能比较的深入解析
  • C#中IList<T>与List<T>的区别深入解析
  • 深入分析C#中WinForm控件之Dock顺序调整的详解
  • C#中静态的深入理解
  • C#泛型约束的深入理解
  • C#之CLR内存深入分析
  • 深入解析c#中枚举类型的定义与使用
  • 深入c#绘制验证码的详解
  • 深入c# 类和结构的区别总结详解
  • 深入c# GDI+简单绘图的具体操作步骤(一)
  • 深入探讨C#中的结构struct
  • 深入理解C# abstract和virtual关键字
  • c#方法中调用参数的值传递方式和引用传递方式以及ref与out的区别深入解析
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 深入分析为Visual Assist设置快捷键的方法
  • Docker支持更深入的容器日志分析
  • 关于《深入浅出MFC》
  • Linux有没有什么好的高级的书,我要深入,
  • 深入理解linux内核
  • [100分]有没有关于binutils的深入的资料?或者深入底层的资料?
  • 深入理解PHP内核 TIPI
  • HTML教程 iis7站长之家
  • 哪位有《JSP深入编程》电子版?
  • 想要深入学习LINUX该学什么?
  • 100分求:哪儿有《深入理解linux内核》可供下哉!
  • 如何深入Linux的内核学习?
  • U-BOOT得掌握到什么程序,用不用深入去学
  • 想深入了解操作系统该怎么做
  • 前一阵子学习了shell脚本,如果想深入点了解linux可以看什么书呢
  • 问一个《深入理解计算机系统》中的问题
  • 深入多线程之:深入分析Interlocked
  • ##想买书深入学习linux下的编程,请指教
  • 深入JDBC sqlserver连接写法的详解
  • 深入oracle特定信息排序的分析
  • 深入分析C中不安全的sprintf与strcpy
  • 哪儿有下载《深入理解Linux内核》这本书?(中文)


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3