表单上所有控件的一个事件处理程序

时间:2011-09-14 02:15:16

标签: c# visual-studio-2010 keyboard-events

我在为表单上的所有控件设置相同的事件处理程序时遇到问题。 我想在我的应用程序中统一处理按下的f5-f7按钮,所以我尝试为表单上的所有控件注册相同的事件处理程序。 我插了

foreach (System.Windows.Forms.Control cont in this.Controls)
                cont.KeyDown += new System.Windows.Forms.KeyEventHandler(this.MainForm_KeyPress);
在自动生成ResumeLayout / PerformLayout调用之前的InitializeComponent()函数中的

。不要介意名称MainForm_KeyPress,它现在实际上是一个KeyDown事件处理程序。

我还尝试在我的init()函数中插入代码,该函数是从构造函数调用的。 但结果是一样的:按键时不会发生事件。焦点在于表单的一个按钮。

但是如果我使用设计工具(将函数名称复制到KeyPress事件字段)为其中一个按钮实现处理程序,则如果按钮处于焦点,则事件会正确引发。

为什么foreach不起作用的任何想法?

2 个答案:

答案 0 :(得分:6)

MSDN表示,您可以将KeyPreview设置为true。

答案 1 :(得分:1)

也许你需要递归并将它注册到你遇到的每个控件的子控件上,在树下?

我遇到这个问题时要做的第一件事是在注册和输出“现在注册”+控件名称周围放置{}。通过这种方式,您可以观察并查看正在注册的控件数量以及它们的含量。也许它只是主面板,子控件处理密钥?我在Dockmanager工作时遇到了关键按键事件处理程序的麻烦,dockmanager正在另一个级别处理键盘并将事件路由到它认为应该得到它的特定子控件。

如果你仍然没有弄明白,我接下来要做的就是连接表单的事件,或者甚至监视WM_ windows消息事件。在某些时候,WM_被代码翻译成.NET事件,这可以用你不期望的方式实现,并被第三方控件等劫持。操作系统必须将WM_事件路由到你的进程,所以使用传递事件处理程序跟踪它们,记录通过的内容。

我完全忘记了它是如何工作的,但是当处理像按键这样的事件时,你可以返回一个bool或者在事件中设置一个标志,表示你已经处理过它,并且在dockmanager实现中我看到你说你是否处理过它,将事件传递给子控件的循环将停止,强制执行键盘事件只应触发一个操作的想法。

相关问题