我在表单上有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();
}
答案 0 :(得分:1)
首先要做的事情 - 我不建议使用 Alt 创建快捷方式。在Windows应用程序中, Alt 键是为键盘加速器保留的。它们是您在控件标题中看到某些字母下划线的原因。例如,如果您使用标题为“& Journal”的Button控件,它将显示为日记,您可以按 Alt + J 来“点击” “键盘上的那个按钮没有触摸鼠标,这对于可访问性原因非常重要。
如果您希望与此行为保持一致,并且您的按钮更像是一个下拉按钮(即,在用鼠标单击时显示菜单的按钮),那么您的任务非常简单。如上所示标记按钮(使用字符串中的&
字符表示所需的加速器,在您的情况下为M
),然后连接代码以显示下拉菜单正如您在Click
事件处理程序中通常所做的那样。
如果您想让您的应用程序混乱且难以使用,并且您没有下拉按钮,那么您将需要手动拦截键盘事件并欺骗窗口管理器。不言而喻,这将更加困难。
您需要克服的主要问题是重点。只有聚焦控件才能接收键盘事件,并且一次只能聚焦一个控件。因此,如果您的表单除了按钮之外还包含多个控件(例如文本框),那么任何其他控件都可能具有焦点而不是按钮。这意味着他们将收到键盘事件,并可能以他们自己的方式对他们做出反应。这就是KeyPress
事件没有按照您的意愿执行的原因(KeyDown
和KeyUp
事件会出现同样的问题)。这些事件与特定控件相关联,只有当它们所连接的控件聚焦时才会触发。
如果要转义此操作,则需要处理“更高”级别的键盘事件。在WinForms中执行此操作的标准方法是在表单级别通过覆盖ProcessCmdKey
method。在重写的方法中,您将测试所需的键盘组合,并在适当的情况下显示弹出菜单。例如:
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
方法。在your previous question中,我得到了您尝试使用Select
以确保上下文菜单重点突出的印象。你不需要这样做; Show
方法已经为您处理了这个问题。