第一种:Alt + *(按钮快捷键)
在大家给button、label、menuStrip等控件设置Text属性时在名字后边加&键名就可以了,比如button1.text= "确定(&O)"。就会有快捷键了,这时候按Alt+O就可以执行按钮单击事件。
第二种:Ctrl+*及其他组合键
在WinForm中设置要使用组合键的窗体的KeyPreview(向窗体注册键盘事件)属性为True;
然后使用窗体的KeyDown事件(在首次按下某个键时发生).
实例代码:
private void ***_KeyDown(object sender, KeyEventArgs e) {
if (e.KeyCode == Keys.F && e.Control) { button1.PerformClick(); //执行单击button1的动作 }
}
注:1、***代表窗体名称,大家可以看一下 ”Keys”的枚举参数,以实现自己需要
2、还有一个问题,当使用Ctrl + *快捷键时,对于焦点在可写的控件(如TextBox)上时,可能会将* 键值同时输入,则需要加另一句话将Handled设置为true,以取消 KeyPress 事件。
即:
private void ***_KeyDown(object sender, KeyEventArgs e) {
if (e.KeyCode == Keys.F && e.Control) {
e.Handled = true; //将Handled设置为true,指示已经处理过KeyPress事件 button1.PerformClick();
}
}
第三种:
还是以button为例。给form添加一个contextMenuStrip1,将其邦定到button上,假设为button1。给 contextMenuStrip1添加一个item,然后为它设置快捷键(就是你想加在button上的快捷键),并且将它的Visible属性设为 false。这样,button1的快捷键设置成功。
最近找了一些资料,是讲在C#中设置快捷键运行方法或程序的 要设置快捷键必须使用user32.dll下面的两个方法。 BOOL RegisterHotKey( HWND hWnd, int id, UINT fsModifiers, UINT vk ); 和 BOOL UnregisterHotKey( HWND hWnd, int id ); 转换成C#代码,那么首先就要引用命名空间System.Runtime.InteropServices;来加载非托管类user32.dll。于是有了: [DllImport("user32.dll", SetLastError=true)] public static extern bool RegisterHotKey( IntPtr hWnd, // handle to window int id, // hot key identifier KeyModifiers fsModifiers, // key-modifier options Keys vk // virtual-key code ); [DllImport("user32.dll", SetLastError=true)] public static extern bool UnregisterHotKey( IntPtr hWnd, // handle to window int id // hot key identifier ); [Flags()] public enum KeyModifiers { None = 0, Alt = 1, Control = 2, Shift = 4, Windows = 8 } 这是注册和卸载全局快捷键的方法,那么我们只需要在Form_Load的时候加上注册快捷键的语句,在FormClosing的时候卸载全局快 捷键。同时,为了保证剪贴板的内容不受到其他程序调用剪贴板的干扰,在Form_Load的时候,我先将剪贴板里面的内容清空。 于是有了: private void Form1_Load(object sender, System.EventArgs e) { label2.AutoSize = true; Clipboard.Clear();//先清空剪贴板防止剪贴板里面先复制了其他内容 RegisterHotKey(Handle, 100, 0, Keys.F10); } private void Form1_FormClosing(object sender, FormClosingEventArgs e) { UnregisterHotKey(Handle, 100);//卸载快捷键 } 那么我们在别的窗口,怎么让按了快捷键以后调用我的主过程ProcessHotkey()呢? 那么我们就必须重写WndProc()方法,通过监视系统消息,来调用过程: protected override void WndProc(ref Message m)//监视Windows消息 { const int WM_HOTKEY = 0x0312;//按快捷键 switch (m.Msg) { case WM_HOTKEY: ProcessHotkey();//调用主处理程序 break; } base.WndProc(ref m); } 有时,我们想让窗体直接接受回车事件,并执行相关按钮的功能,如在登录界面中,我们想在输入用户名和密码后,直接按回车执行【确定】按钮的功能。这如何实现呢?实际上在C#中这件事情变得很简单,只要按照下面的步骤去做就行了。 选中窗体,在属性栏中寻找AcceptButton属性,只要把它的值设置成你想执行的按钮事件就可以了。 这个属性就是当用户按下回车后,指定哪个按钮来执行这个时间处理程序。 |