一个事件处理程序用于窗体上的所有控件

本文关键字:窗体 控件 用于 程序 一个 事件处理 | 更新日期: 2023-09-27 18:08:44

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

foreach (System.Windows.Forms.Control cont in this.Controls)
                cont.KeyDown += new System.Windows.Forms.KeyEventHandler(this.MainForm_KeyPress);
在InitializeComponent()函数中

,然后自动生成resumayout/PerformLayout调用。不要介意MainForm_KeyPress这个名字,它现在实际上是一个KeyDown事件处理程序。

我还试图在我的init()函数中插入代码,该函数是从构造函数调用的。但结果是一样的:当我按下按键时,事件没有发生。重点放在表单的一个按钮上。

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

知道为什么foreach不起作用吗?

一个事件处理程序用于窗体上的所有控件

MSDN说你可以把KeyPreview设置为true

也许您需要递归并为您遇到的每个控件的子控件注册它,在树的下面?

遇到此问题时,我要做的第一件事是将{}放在注册周围并输出"现在注册为"+控件名称。这样你就可以看到有多少控件被注册以及它们是什么。也许只有主面板,子控件处理按键?当在dockmanager中工作时,我也遇到了按键事件处理程序的麻烦,dockmanager在另一个级别处理键盘并将事件路由到它认为应该得到它的特定子控件。

如果你仍然不明白,接下来我要做的是连接表单的事件,或者甚至监视WM_ windows消息事件。在某种程度上,WM_被代码转换成。net事件,这可能以你意想不到的方式实现,并被第三方控件劫持,等等。操作系统必须将WM_事件路由到您的进程,因此使用传递事件处理程序来跟踪它们,该事件处理程序记录所经历的事情。

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