在Windows窗体应用程序中实现键盘快捷方式的最佳方法?

我正在寻找一种在我的Windows窗体应用程序在C#中实现常用Windows键盘快捷键(例如Ctrl + FCtrl + 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); } 

在你的主窗体上

  1. KeyPreview设置为True
  2. 使用以下代码添加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;