我正在寻找一个最好的方法来实现常用的Windows键盘快捷键(例如Ctrl+F, Ctrl+N)在我的Windows窗体应用程序在c#。

应用程序有一个主表单,它承载许多子表单(一次一个)。当用户按Ctrl+F时,我希望显示一个自定义搜索表单。搜索表单将依赖于应用程序中当前打开的子表单。

我在考虑在ChildForm_KeyDown事件中使用这样的东西:

   if (e.KeyCode == Keys.F && Control.ModifierKeys == Keys.Control)
        // Show search form

但这行不通。当你按下一个键时,事件甚至不会触发。解决方案是什么?


当前回答

您可能忘记将表单的KeyPreview属性设置为True。覆盖ProcessCmdKey()方法是通用的解决方案:

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);
}

其他回答

如果你有一个菜单,那么改变ToolStripMenuItem的ShortcutKeys属性应该可以做到这一点。

如果不是,您可以创建一个,并将其可见属性设置为false。

您可能忘记将表单的KeyPreview属性设置为True。覆盖ProcessCmdKey()方法是通用的解决方案:

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(对象发送器,KeyEventArgs e) { if (e.Control && e.KeyCode == Keys.N) { SearchForm = new SearchForm(); searchForm.Show (); } }

对于新手来说,汉斯的回答可能会更容易一些,所以这是我的版本。

你不需要愚弄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();
    }
}

你甚至可以试试这个例子:

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...
}