首先要做的事——我不建议使用Alt. 在 Windows 应用程序中,该键是为键盘快捷Alt键保留的。它们是您在控件标题中看到某些字母加下划线的原因。例如,如果您是一个带有标题“&Journal”的 Button 控件,它将显示为 J̲ournal,并且您可以在不触摸鼠标的情况下按+键从键盘“单击”该按钮,这对于可访问性原因非常重要.AltJ
如果您希望与此行为保持一致并且您的按钮更像是一个下拉按钮(即,当用鼠标单击时显示菜单的按钮),那么您的任务相当简单。如上所示标记按钮(使用&
字符串中的字符表示所需的加速器,在您的情况下为M
),然后连接代码以显示下拉菜单,就像您通常在Click
事件处理程序中一样。
如果您想让您的应用程序混乱且难以使用,并且您没有下拉按钮,那么您将需要手动拦截键盘事件并欺骗窗口管理器。不用说,这将更加困难。
你需要克服的主要问题是专注。只有获得焦点的控件接收键盘事件,并且一次只能获得一个控件的焦点。因此,如果您的表单除了按钮之外还包含多个控件(例如文本框),则任何其他控件都可能拥有焦点而不是按钮。这意味着他们将接收键盘事件并可能以自己的方式对它们做出反应。这就是为什么KeyPress
事件没有做你想做的事情(KeyDown
和KeyUp
事件会有同样的问题)。这些事件与特定控件相关联,并且仅在它们所连接的控件被聚焦时才会触发。
如果你想逃避这个,你需要在“更高”级别处理键盘事件。在 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
方法已经为您处理了。