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

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

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

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

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


当前回答

最好的方法是使用菜单助记符,也就是说,在主窗体中为菜单项分配你想要的键盘快捷键。然后,其他所有事情都在内部处理,您所要做的就是实现在该菜单项的Click事件处理程序中执行的适当操作。

其他回答

最好的方法是使用菜单助记符,也就是说,在主窗体中为菜单项分配你想要的键盘快捷键。然后,其他所有事情都在内部处理,您所要做的就是实现在该菜单项的Click事件处理程序中执行的适当操作。

在WinForm中,我们总是可以通过以下方式获得Control Key的状态:

bool IsCtrlPressed = (Control.ModifierKeys & Keys.Control) != 0;

VB。Hans回答的NET版本。

(Visual Studio中有一个ProcessCmdKey函数模板。)

  Protected Overrides Function ProcessCmdKey(ByRef msg As Message, keyData As Keys) As Boolean

    If (keyData = (Keys.Control Or Keys.F)) Then
      ' call your sub here, like
      SearchDialog()
      Return True
    End If

    Return MyBase.ProcessCmdKey(msg, keyData)
  End Function

End Class

您可能忘记将表单的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。