1

我有button一个表单,我想使用Alt+M来显示ContextMenuStrip(cmsJournal),不幸的是,当我使用该快捷方式时,按钮获得了焦点,但没有KeyPress event被触发。

Alt当我按+时我想使用以下方法M

    private void PopJournalMenu() {
        cmsJournal.Show(btnJournal, new System.Drawing.Point(0, 0 - cmsJournal.Height));
        tsmiAPPayment.Select();
    }
4

1 回答 1

1

首先要做的事——我不建议使用Alt. 在 Windows 应用程序中,该键是为键盘快捷Alt键保留的。它们是您在控件标题中看到某些字母加下划线的原因。例如,如果您是一个带有标题“&Journal”的 Button 控件,它将显示为 J̲ournal,并且您可以在不触摸鼠标的情况下按+键从键盘“单击”该按钮,这对于可访问性原因非常重要.AltJ

如果您希望与此行为保持一致并且您的按钮更像是一个下拉按钮(即,当用鼠标单击时显示菜单的按钮),那么您的任务相当简单。如上所示标记按钮(使用&字符串中的字符表示所需的加速器,在您的情况下为M),然后连接代码以显示下拉菜单,就像您通常在Click事件处理程序中一样。

如果您想让您的应用程序混乱且难以使用,并且您没有下拉按钮,那么您将需要手动拦截键盘事件并欺骗窗口管理器。不用说,这将更加困难。

你需要克服的主要问题是专注。只有获得焦点的控件接收键盘事件,并且一次只能获得一个控件的焦点。因此,如果您的表单除了按钮之外还包含多个控件(例如文本框),则任何其他控件都可能拥有焦点而不是按钮。这意味着他们将接收键盘事件并可能以自己的方式对它们做出反应。这就是为什么KeyPress事件没有做你想做的事情(KeyDownKeyUp事件会有同样的问题)。这些事件与特定控件相关联,并且仅在它们所连接的控件被聚焦时才会触发。

如果你想逃避这个,你需要在“更高”级别处理键盘事件。在 WinForms 中执行此操作的标准方法是在表单级别通过覆盖ProcessCmdKey方法。在您的覆盖方法中,您将测试所需的键盘组合,并在适当的情况下显示弹出菜单。例如:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
   if (keyData == (Keys.Alt | Keys.M))
   {
      cmsJournal.Show(btnJournal, new Point(0, 0 - cmsJournal.Height));
      return true; // indicate that you handled the key event
   }
   return base.ProcessCmdKey(ref msg, keyData);
}

或者,您可以调用您的PopJournalMenu方法。不过,我不确定tsmiAPPayment您需要调用它的Select方法是什么或为什么需要调用它。在您之前的问题中,我得到了您试图用来Select确保上下文菜单集中的印象。你不需要这样做;该Show方法已经为您处理了。

于 2013-02-15T00:09:21.297 回答