在Windows窗体应用程序中实现键盘快捷方式的最佳方法?
我正在寻找一种在我的Windows窗体应用程序在C#中实现常用Windows键盘快捷键(例如Ctrl + F , Ctrl + N )的最佳方法。
该应用程序有一个主要的forms,托pipe许多儿童forms(一次一个)。 当用户点击Ctrl + F时 ,我想显示一个自定义search表单。 search表单将取决于应用程序中当前打开的子表单。
我正在考虑在ChildForm_KeyDown事件中使用这样的事情:
if (e.KeyCode == Keys.F && Control.ModifierKeys == Keys.Control) // Show search form
但是这不起作用。 按下按键时,事件甚至不会启动。 解决办法是什么?
您可能忘记将窗体的KeyPreview属性设置为True。 重写ProcessCmdKey()方法是通用的解决scheme:
protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { if (keyData == (Keys.Control | Keys.F)) { MessageBox.Show("What the Ctrl+F?"); return true; } return base.ProcessCmdKey(ref msg, keyData); }
在你的主窗体上
- 将
KeyPreview
设置为True -
使用以下代码添加KeyDown事件处理程序
private void MainForm_KeyDown(object sender, KeyEventArgs e) { if (e.Control && e.KeyCode == Keys.N) { SearchForm searchForm = new SearchForm(); searchForm.Show(); } }
最好的方法是使用菜单助记符,即在主窗体中有菜单条目,指定您想要的键盘快捷键。 然后,其他所有内容都将在内部处理,您只需实现在该菜单项的Click
事件处理程序中执行的相应操作即可。
你甚至可以尝试这个例子:
public class MDIParent : System.Windows.Forms.Form { public bool NextTab() { // some code } public bool PreviousTab() { // some code } protected override bool ProcessCmdKey(ref Message message, Keys keys) { switch (keys) { case Keys.Control | Keys.Tab: { NextTab(); return true; } case Keys.Control | Keys.Shift | Keys.Tab: { PreviousTab(); return true; } } return base.ProcessCmdKey(ref message, keys); } } public class mySecondForm : System.Windows.Forms.Form { // some code... }
如果你有一个菜单,然后更改ToolStripMenuItem
ShortcutKeys
属性应该做的伎俩。
如果没有,你可以创build一个,并将其visible
属性设置为false。
对于新来的人来说, 汉斯的回答可能会更容易些,所以这里是我的版本。
您不需要用KeyPreview
欺骗,将其设置为false
。 要使用下面的代码,只需将其粘贴到form1_load
下面,然后使用F5运行即可:
protected override void OnKeyPress(KeyPressEventArgs ex) { string xo = ex.KeyChar.ToString(); if (xo == "q") //You pressed "q" key on the keyboard { Form2 f2 = new Form2(); f2.Show(); } }
从主窗体中,您必须:
- 确保将KeyPreview设置为true (默认为TRUE)
- 添加MainForm_KeyDown (..) – 你可以在这里设置你想要的快捷键。
另外,我在谷歌上find了这个,我想分享给那些仍在寻找答案的人。 (全球)
我认为你必须使用user32.dll
protected override void WndProc(ref Message m) { base.WndProc(ref m); if (m.Msg == 0x0312) { /* Note that the three lines below are not needed if you only want to register one hotkey. * The below lines are useful in case you want to register multiple keys, which you can use a switch with the id as argument, or if you want to know which key/modifier was pressed for some particular reason. */ Keys key = (Keys)(((int)m.LParam >> 16) & 0xFFFF); // The key of the hotkey that was pressed. KeyModifier modifier = (KeyModifier)((int)m.LParam & 0xFFFF); // The modifier of the hotkey that was pressed. int id = m.WParam.ToInt32(); // The id of the hotkey that was pressed. MessageBox.Show("Hotkey has been pressed!"); // do something } }
进一步阅读这个http://www.fluxbytes.com/csharp/how-to-register-a-global-hotkey-for-your-application-in-c/
在WinForm中,我们总是可以通过以下方式获得控制键状态:
bool IsCtrlPressed = (Control.ModifierKeys & Keys.Control) != 0;