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

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

  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. 在navicat上设置定时计划执行存储过程

    原文 应用情景: 有一个存储过程,需要每天定时执行一次.所以在navicat上使用事件处理,当然还有其他的方法,这只是一种.作为参考 1.事件定义填写 2.事件计划设置 3.保存 点击上方保存即可 常 ...

  2. #上海ORACLE用户组2014在论坛#时刻

    #上海ORACLE用户组2014年高峰论坛#精彩瞬间 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYXNrbWFjbGVhbg==/font/5a6L5L ...

  3. 图片及js的预加载

    loadImage : function (url, dataObj, callback, errorCallback) { var self = this; var img = new Image( ...

  4. Modbus TCP 示例报文

    调试modbus  tcp 整理百度文库文档如下 <modbus-tcp-报文举例分析> <MODBUSTCP通讯报文> Client request: 19 B2 00 00 ...

  5. WPF中的3D Wireframe

    原文:WPF中的3D Wireframe WPF不支持画三维线,但开发人员提供了ScreenSpaceLines3D 类用于实现这个功能.我已经在程序中实现并成功显示3D Wireframe,并能够进 ...

  6. Expression.Blend.4 Chapter 接口设计

    原文:Expression.Blend.4 Chapter 接口设计 发现网上关于silverlight,WPF美工系列的书籍一直很少,而且很多都是英文的.在公司无聊,开始进行翻译. 翻译的地方可能有 ...

  7. crossplaform---Nodejs in Visual Studio Code 04.Swig模版

    1.开始 设置Node_Global:npm config set prefix "C:\Program Files\nodejs" Express组件:npm install e ...

  8. 解决MacOS下readlink: illegal option -- f

    时间: 2017.03.21 分类: [操作系统] 评论 Mac下的readlink没有-f参数,诸如screenfetch又会去调用readlink -f,于是每次都会出现: readlink: i ...

  9. WPF 属性变更通知类的实现

    原文:WPF 属性变更通知类的实现 平时用依赖属性多一些,普通属性的变更通知知道有这个方法,但是老是忘记名字,再写一遍吧. public class Student : INotifyProperty ...

  10. Layui 2.0.0 正式发布:潜心之作,开箱即用的前端UI框架(确实很多内容)

    Hi,久违了.处暑逼近之际,潜水半年的 layui 是时候出来透透气了.我们带来的是全新的 2.0 版本,一次被我们定义为“破茧重生”的倾情之作.如果你已曾用过 layui,你将真正感受到一次因小而大 ...