参考自:http://www.csharpwin.com/csharpspace/3932r8132.shtml
一、C# button快捷键之第一种:Alt + *(按钮快捷键)
在Button按钮的Text属性的文本名称加(&键名)就可以了,如button1.Text = "保存(&S)"; 这样只要按Alt+S就可以执行按钮的单击事件。
二、C# button快捷键之第二种:Ctrl+*及其他组合键
在WinForm中设置要使用组合键的窗体的KeyPreview(向窗体注册键盘事件)属性为True;然后使用窗体的KeyDown事件(在首次按下某个键时发生)或KeyPress事件或KeyUp事件
private void Form1_KeyDown(object sender, KeyEventArgs e) {
// if (Control.ModifierKeys == Keys.Control && e.KeyCode == Keys.S) if (e.KeyCode == Keys.S && e.Control) { button1.PerformClick(); //执行单击button1的动作 } }
还有一个问题,当使用Ctrl + *快捷键时,对于焦点在可写的控件(如TextBox)上时,可能会将* 键值同时输入,则需要加另一句话将Handled设置为true,以取消 KeyDown 事件。
private void Form1_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.S && e.Control) { e.Handled = true; //将Handled设置为true,指示已经处理过KeyDown事件 button1.PerformClick(); //执行单击button1的动作 } }
三、C# button快捷键之第三种方法(不推荐使用该方式)
还是以button为例。给form添加一个contextMenuStrip1,将其邦定到form窗体的ContextMenuStrip属性上。给contextMenuStrip1添加一个item,然后为它设置快捷键(在右键菜单项的ShortcutKeys属性上设置快捷键),将它的Visible属性设为false,并且将它的点击事件设为button的点击事件方法。这样,C#button快捷键设置成功。
四、C# button快捷键之第四种方法:重写ProcessCmdKey(ref Message msg, Keys keyData)方法
protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { //处理要做的事, //不希望做其它做用,return true // 要做其它的 return base.ProcessCmdKey(ref msg, keyData); }
protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { // 按快捷键Ctrl+S执行按钮的点击事件方法 if (keyData == (Keys)Shortcut.CtrlS) { button1.PerformClick(); return true; } return base.ProcessCmdKey(ref msg, keyData); // 其他键按默认处理 }
protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { // 实现按Enter键来实现Ctrl+S键的功能 if (keyData == Keys.Enter) { SendKeys.Send("^s"); return true; } // 按快捷键Ctrl+S执行按钮的点击事件方法 //if (keyData == (Keys.Control | Keys.S))
if (keyData == (Keys)Shortcut.CtrlS) { button1.PerformClick(); return true; } return base.ProcessCmdKey(ref msg, keyData); // 其他键按默认处理
}
SendKeys.Send(string keys),要发送的键字符串,可以查看MSDN:http://msdn.microsoft.com/zh-cn/library/system.windows.forms.sendkeys.send(v=VS.80).aspx
如果ProcessCmdKey(ref Message msg, Keys keyData)方法的效果不行,可以试试ProcessDialogKey(Keys keyData)方法
protected override bool ProcessDialogKey(Keys keyData) { if (keyData == Keys.Enter) { keyData = Keys.Tab; //ProcessTabKey(true); } return base.ProcessDialogKey(keyData); }
另:Form 重写ProcessCmdKey: 解决enter同时Tab 的问题
protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { if (keyData == Keys.Enter && ((!(ActiveControl is System.Windows.Forms.TextBox) || !((System.Windows.Forms.TextBox)ActiveControl).AcceptsReturn))) { SendKeys.SendWait("{Tab}"); return true; } if (keyData == ( Keys.Enter | Keys.Shift)) { SendKeys.SendWait("+{Tab}"); return true; } return base.ProcessCmdKey(ref msg, keyData); }
五、C# button快捷键之第五种方法:使用系统API (来自:http://blog.sina.com.cn/s/blog_674a665801013hit.html)
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.Runtime.InteropServices; namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { MessageBox.Show("使用快捷键启动按钮"); } private void Form1_Load(object sender, EventArgs e) { //注册热键Ctrl+F12,这里的8879就是一个ID识别 RegisterHotKey(this.Handle, 8879, 2, Keys.F12); } private void Form1_FormClosing(object sender, FormClosingEventArgs e) { //用来取消注册的热键 UnregisterHotKey(this.Handle, 8879); } /// <summary> /// 注册热键 /// </summary> /// <param name="hWnd">为窗口句柄</param> /// <param name="id">注册的热键识别ID</param> /// <param name="control">组合键代码 Alt的值为1,Ctrl的值为2,Shift的值为4,Shift+Alt组合键为5 /// Shift+Alt+Ctrl组合键为7,Windows键的值为8 /// </param> /// <param name="vk">按键枚举</param> /// <returns></returns> [DllImport("user32")] public static extern bool RegisterHotKey(IntPtr hWnd, int id, uint control, Keys vk); /// <summary> /// 取消注册的热键 /// </summary> /// <param name="hWnd">窗口句柄</param> /// <param name="id">注册的热键id</param> /// <returns></returns> [DllImport("user32")] public static extern bool UnregisterHotKey(IntPtr hWnd, int id); // 响应热键 protected override void WndProc(ref Message m) { switch (m.Msg) { case 0x0312: //这个是window消息定义的注册的热键消息 if (m.WParam.ToString().Equals("8879")) //如果是注册的那个热键 { // 执行button按钮 button1.PerformClick(); } break; } base.WndProc(ref m); } } }