Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 窗体上所有控件的一个事件处理程序_C#_Visual Studio 2010_Keyboard Events - Fatal编程技术网

C# 窗体上所有控件的一个事件处理程序

C# 窗体上所有控件的一个事件处理程序,c#,visual-studio-2010,keyboard-events,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); 在Initi

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

foreach (System.Windows.Forms.Control cont in this.Controls)
                cont.KeyDown += new System.Windows.Forms.KeyEventHandler(this.MainForm_KeyPress);
在InitializeComponent()函数中,在自动生成ResumeLayout/PerformLayout调用之前。不要介意名称MainForm_KeyPress,它现在实际上是一个KeyDown事件处理程序

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

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


你知道为什么foreach不工作吗?

也许你需要递归并注册到树下遇到的每个控件的子控件中

遇到这个问题时,我要做的第一件事是将{}放在注册周围,并输出“now registing for”+控件名。通过这种方式,您可以观察并查看注册了多少控件以及它们是什么。也许只是主面板,而分包商处理的是钥匙?在dockmanager中工作时,我也遇到过按键事件处理程序的问题,dockmanager在另一个级别处理键盘,并将事件路由到它认为应该得到它的特定子控件

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


我完全忘记了它是如何工作的,但当处理一个事件(如按键)时,您可以返回bool或在事件上设置一个标志,表明您已经处理了它。在dockmanager实现中,我看到,如果您说您已经处理了它,则将事件传递给子控件的循环将停止,强化键盘事件只应触发一个操作的想法。

MSDN说,设置为true就可以了。

一个事件处理程序来控制所有操作?请不要在标题前加上“C:”。这就是标记的用途。@Jason-在黑暗中数据绑定它们。@Jason是的,我想要一些特殊的按钮来统一工作。这些按钮调用设备日志捕获,并且日志与时间相关,因此无论焦点在哪里,都必须处理这些按钮的按下事件。这似乎是一种方法,您只需在表单级别注册一个事件。只需确保对实际处理的关键事件将e.Handled设置为true(以避免双重操作),对所有其他事件将e.Handled设置为false(或者我认为您将禁用所有其他键盘交互)。MSDN中的示例代码在所有情况下都设置为false,这有点过于简单。我首先看到了您的答案,然后按照您的建议检查是否在foreach中处理了所有控件。您是对的,未注册子控件。所以我添加了一个递归,一切都很好。但是Ingenu的答案更简单,所以我将使用它=)再次感谢你!很遗憾,我不能在两篇帖子上注明答案