始终以基本形式处理PreviewKeyDown事件

时间:2008-11-05 23:54:19

标签: c# winforms

我们需要在基本表单中处理此事件,而不管当前哪些控件具有焦点。无论控制焦点如何,我们都需要使用几个全局关键命令。

这通过正常处理表单中的PreviewKeyDown事件来工作。当我们向表单添加用户控件时,事件不再触发。

我在这里错过了一些小事吗?或者我们是否需要首先在用户控件中处理事件?

感谢您的帮助!

谢谢因素。当我得到更多时间:)我会让它工作'properley'!

4 个答案:

答案 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方法中,你可以做你的工作,无论哪个控件都有焦点,它都应该触发。