我们需要在基本表单中处理此事件,而不管当前哪些控件具有焦点。无论控制焦点如何,我们都需要使用几个全局关键命令。
这通过正常处理表单中的PreviewKeyDown事件来工作。当我们向表单添加用户控件时,事件不再触发。
我在这里错过了一些小事吗?或者我们是否需要首先在用户控件中处理事件?
感谢您的帮助!
谢谢因素。当我得到更多时间:)我会让它工作'properley'!
答案 0 :(得分:2)
您使用的隐藏菜单适用于作为有效菜单项快捷方式的快捷方式,但如果您想使用任何键作为快捷方式(例如Page Up / Page Down),您将需要一个不同的技巧。 / p>
另一种不涉及P / Invoke的方法是将表单的Form.KeyPreview
属性设置为true。这将导致所有按键按下首先发送到表单,无论哪个控件具有焦点。然后,您可以覆盖OnKeyDown,OnKeyPress和/或OnKeyUp,以便在任何控件之前处理按键操作。
答案 1 :(得分:1)
PreviewKeyDown仅在控件具有焦点时有效。听起来你应该查看应用程序级别 hook 以获取特殊的快捷键。你必须用P / Invoke来做。 pinvoke.net上的SetWindowsHookEx是个例子的好地方。这是一个MS KB article about a mouse hook in c#,似乎已扩展为键盘挂钩in this article。
答案 2 :(得分:1)
我们最终这样做了:
我通过设置隐藏菜单项找到了解决方法:
ToolStripMenuItem.Visible = false
(感谢this article)。
似乎总是会搜索表单的主菜单以查找快捷键组合。无论控件具有焦点,这都有效
答案 3 :(得分:0)
这可能不是最好的方式,但是第一种想到的方式。
在表单构造函数中,在调用InitializeComponent()之后;做这样的事情:
foreach (Control control in this.Controls)
{
control.PreviewKeyDown += new PreviewKeyDownEventHandler(HandlePreviewKeyDown);
}
我认为应该这样做。在你的HandlePreviewKeyDown方法中,你可以做你的工作,无论哪个控件都有焦点,它都应该触发。