我们在软件中经常用到快捷键,这里整理备份一下。

首先我们要定义可以作为快捷键的按键,以下是整理的 一些,自己可以根据情况来修改

  public static Dictionary<int, string> HotKeys = new Dictionary<int, string>()
{
{,""},
{,""},
{,""},
{,""},
{,""},
{,""},
{,""},
{,""},
{,""},
{,""},
{,"A"},
{,"B"},
{,"C"},
{,"D"},
{,"E"},
{,"F"},
{,"G"},
{,"H"},
{,"I"},
{,"J"},
{,"K"},
{,"L"},
{,"M"},
{,"N"},
{,"O"},
{,"P"},
{,"Q"},
{,"R"},
{,"S"},
{,"T"},
{,"U"},
{,"V"},
{,"W"},
{,"X"},
{,"Y"},
{,"Z"},
{,"F1"},
{,"F2"},
{,"F3"},
{,"F4"},
{,"F5"},
{,"F6"},
{,"F7"},
{,"F8"},
{,"F9"},
{,"F10"},
{,"F11"},
{,"F12"},
{,"PageUp"},
{,"PageDown"},
{,"End"},
{,"Home"},
{,"←"},
{,"↑"},
{,"→"},
{,"↓"},
{,"Insert"},
{,"Delete"},
{,";"},
{,"="},
{,","},
{,"-"},
{,"."},
{,"/"},
{,"`"},
{,"["},
{,"\\"},
{,"]"}
};

然后弄个数据表存一下定义功能对应的快捷键,表结构如下

CREATE TABLE [dbo].[HotKey](
[ID] [int] IDENTITY(,) NOT NULL,
[FrmName] [nvarchar]() NULL,
[Sort] [int] NULL,
[ActionName] [nvarchar]() NULL,
[ActionKey] [nvarchar]() NULL,
[KeyValue] [nvarchar]() NULL
) ON [PRIMARY] GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'界面' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'HotKey', @level2type=N'COLUMN',@level2name=N'FrmName'
GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'顺序' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'HotKey', @level2type=N'COLUMN',@level2name=N'Sort'
GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'功能名称' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'HotKey', @level2type=N'COLUMN',@level2name=N'ActionName'
GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'功能编码' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'HotKey', @level2type=N'COLUMN',@level2name=N'ActionKey'
GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'热键' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'HotKey', @level2type=N'COLUMN',@level2name=N'KeyValue'
GO

系统启动的时候缓存一下设置的快捷键

public static List<HotKey> HotKeySetting { get; set; }

基类窗体里面写窗体的

写KeyUP  和KeyDown事件

 bool m_blnCtrl = false;
bool m_blnAlt = false;
bool m_blnShift = false; [Description("定义的热键列表"), Category("自定义")]
public Dictionary<int, string> HotKeys { get; set; }
//如果事件返回true则表示已经找到了快捷键事件,则不再向下传递
public delegate bool HotKeyEventHandler(string strHotKey);
/// <summary>
/// 热键事件
/// </summary>
[Description("热键事件"), Category("自定义")]
public event HotKeyEventHandler HotKeyDown; protected void FrmBase_KeyUp(object sender, KeyEventArgs e)
{
if (HotKeyDown != null && HotKeys != null)
{
if (e.KeyCode == Keys.Control || e.KeyCode == Keys.ControlKey)
m_blnCtrl = false;
if (e.KeyCode == Keys.Alt || e.KeyCode == Keys.Menu)
m_blnAlt = false;
if (e.KeyCode == Keys.Shift || e.KeyCode == Keys.ShiftKey)
m_blnShift = false;
}
} protected void FrmBase_KeyDown(object sender, KeyEventArgs e)
{
if (HotKeyDown != null && HotKeys != null)
{
if (e.KeyCode == Keys.Control || e.KeyCode == Keys.ControlKey)
m_blnCtrl = true;
if (e.KeyCode == Keys.Alt || e.KeyCode == Keys.Menu)
m_blnAlt = true;
if (e.KeyCode == Keys.Shift || e.KeyCode == Keys.ShiftKey)
m_blnShift = true;
if (HotKeys.ContainsKey(e.KeyValue))
{
string strKey = string.Empty;
if (m_blnCtrl)
{
strKey += "Ctrl+";
}
if (m_blnAlt)
{
strKey += "Alt+";
}
if (m_blnShift)
{
strKey += "Shift+";
}
strKey += HotKeys[e.KeyValue]; if (HotKeyDown(strKey))
{
e.Handled = true;
e.SuppressKeyPress = true;
}
}
}
}

你会注意到keyup和kedown事件的修饰符是protected,为什么要用protected呢?是因为窗体的一些输入控件的按键事件是不会传递到窗体的,比如textbox这些,所有需要手动指定一下

子窗体中注册事件就可以了,如果你没有用基类窗体,那么直接写在一起就可以了

this.HotKeys = HotKeys;
this.HotKeyDown += FrmMain_HotKeyDown;
//将输入框的2个事件指向窗体的2个事件
this.txtSearch.KeyDown += this.FrmBase_KeyDown;
this.txtSearch.KeyUp += this.FrmBase_KeyUp; /// <summary>
/// 热键按下事件
/// </summary>
/// <param name="strHotKey">热键值</param>
/// <returns>当返回true则表示不再向下传递按键事件,通常当匹配到热键操作后返回true</returns>
bool FrmMain_HotKeyDown(string strHotKey)
{
Console.WriteLine(strHotKey);
string strHotAction = GetHotKeyAction("FrmMain", strHotKey);
if (string.IsNullOrEmpty(strHotAction))
return false;
else
{
//这里根据返回的功能名称做操作就可以了
return true;
}
} public static string GetHotKeyAction(string strFrom, string strHotKey)
{
var entity = HotKeySetting.Find(p => p.FrmName.ToLower() == strFrom.ToLower() && p.KeyValue.ToStringExt().ToLower() == strHotKey.ToLower());
if (entity != null)
return entity.ActionKey;
else
return string.Empty;
}

这样就可以了

c# winform快捷键实现的更多相关文章

  1. C# WinForm快捷键设置技巧

    C# WinForm快捷键设置技巧 1.Alt+*(按钮快捷键) 按钮快捷键也为最常用快捷键,其设置也故为简单.在大家给button.label.menuStrip等其他控件的Text属性指定名称时, ...

  2. WinForm 快捷键设置(转载)

    1.Alt+*(按钮快捷键) 按钮快捷键也为最常用快捷键,其设置也故为简单.在大家给button.label.menuStrip等其他控件的Text属性指定名称时,在其后面加上‘&’然后在加上 ...

  3. WinForm 快捷键设置

    一.窗体快捷键,只在窗体上有效果 首先在form_load的时候写上this.KeyPreview=true;//表示窗体接受按键事件 然后如下 private void Frm_KeyDown(ob ...

  4. [转]C#设置WinForm快捷键

    1.Alt+*(按钮快捷键)按钮快捷键也为最常用快捷键,其设置也故为简单.在大家给button.label.menuStrip等其他控件的Text属性指定名称时,在其后面加上‘&’然后在加上一 ...

  5. c# winform快捷键设置

    设置 Form 的 KeyPreview=true 然后在Form 的案件事件里判断按钮类型进行分别调用就可以了 private void Form1_KeyDown(object sender, K ...

  6. WinForm添加快捷键

    1.    WinForm下给窗体和按钮添加快捷键 设置Enter键要执行的动作:设置FORM的 AcceptButton属性为指定的button按钮. 设置ESC键要执行的动作:设置FORM的Cac ...

  7. 【转】给Winform的button等控件添加快捷键

    ref: http://blog.sina.com.cn/s/blog_4cb9953f0100cy4z.html 第一种:Alt + *(按钮快捷键) 在大家给button.label.menuSt ...

  8. C# WinForm给Button按钮或其它控件添加快捷键响应

    就在这介绍三种添加快捷键的方式. 第一种Alt + *(按钮快捷键) 在大家给button.label.menuStrip等控件设置Text属性时在名字后边加&键名就可以了,比如button1 ...

  9. C# WinForm给Button或其它控件添加快捷键响应

    今天做东西遇到要给按钮添加快捷键.就在这介绍三种添加快捷键的方式. 第一种Alt + *(按钮快捷键) 在大家给button.label.menuStrip等控件设置Text属性时在名字后边加& ...

随机推荐

  1. JQuery 多个checkbox 只选中一个

    <form id="common-form"> <input name="check1" type="checkbox"/ ...

  2. 【a603】加工生产调度

    Time Limit: 1 second Memory Limit: 32 MB [问题描述] 某工厂收到了n个产品的订单,这n个产品分别在A.B两个车间加工,并且必须先在A车间加工后才可以到B车间加 ...

  3. 分布式系统和CAP

    帽子理论(CAP): C:Consistency,一致性, 数据一致更新,所有数据变动都是同步的 A:Availability,可用性, 好的响应性能,完全的可用性指的是在任何故障模型下,服务都会在有 ...

  4. STL关联式容器之map和multimap

    一,map和multimap的概念 1.map和multimap的基本知识 map是标准的关联式容器,一个map是一个键值对序列,即(key,value)对.它提供基于key的快速检索能力. map中 ...

  5. 用Delphi即时判断当前的网络的连接方式

    判断网络的是否连接或者连接方式,比较重要的一点就是是不是即时判断,如果你明明无连接,判断出来却说你有,连接上了,却说你还未连接,下面要介绍的两个方法中 InternetGetConnectedStat ...

  6. Java并发编程:synchronized和Lock

    转自  :   http://www.tuicool.com/articles/qYFzUjf

  7. c语言学习笔记(3)——输入输出

    一.基本的输入和输出函数的用法 printf()  //屏幕输出 用法: (1)printf("字符串\n"); (2)printf("输出控制符", 输出参数 ...

  8. Python: 文件操作与数据读取

    文件及目录操作 python中对文件.文件夹(文件操作函数)的操作需要涉及到os模块,主要用到的几个函数是, import os 返回指定目录下的所有文件和目录名: os.listdir() 重命名: ...

  9. Json格式日期转换为一般日期

    Json日期转换为一般日期:json日期:/Date(1316756746000)/ 转换为2013-09-01格式的   1 //将json格式的时间转换成一般时间 2 function Chang ...

  10. LeetCode OJ平台Sort Colors讨论主题算法

    原题如下面,这意味着无序排列(由0,1,2组成).一号通.组织成若干阵列0-几个1-几个2这样的序列. Given an array with n objects colored red, white ...