Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.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# 每次显示messagebox时运行代码_C#_Forms_Messagebox_Window Handles - Fatal编程技术网

C# 每次显示messagebox时运行代码

C# 每次显示messagebox时运行代码,c#,forms,messagebox,window-handles,C#,Forms,Messagebox,Window Handles,我有一个相当大的C#Forms应用程序。有一个MdiParent可以控制许多MDIChild。我还创建了一个“加载屏幕”,当用户打开需要一些加载时间的表单时,它总是在顶部跳转 问题是,如果有异常,我通常在catch中使用Messagebox.Show(ErrorNumber)之类的东西,这样用户就知道发生了什么。当我的加载屏幕打开时,会显示一个消息框,无法单击它 我想调整一下。有没有一种方法可以将函数放入我的MDI父对象(或者其他地方,只要它只运行一次)中,以便在显示MessageBox时运行代

我有一个相当大的C#Forms应用程序。有一个MdiParent可以控制许多MDIChild。我还创建了一个“加载屏幕”,当用户打开需要一些加载时间的表单时,它总是在顶部跳转

问题是,如果有异常,我通常在catch中使用Messagebox.Show(ErrorNumber)之类的东西,这样用户就知道发生了什么。当我的加载屏幕打开时,会显示一个消息框,无法单击它

我想调整一下。有没有一种方法可以将函数放入我的MDI父对象(或者其他地方,只要它只运行一次)中,以便在显示MessageBox时运行代码?这样,我可以很容易地调用一个函数来关闭我的加载屏幕。可能还有其他解决方案,但我想了解更多关于窗口句柄、挂钩等的信息。

您可以订阅该活动

每次应用程序即将进入模式状态时(例如,因为它即将显示消息框),都会引发此问题


请注意,还有一个相应的事件。

我认为这是一个糟糕的想法。Imho,你应该解决真正的问题,即你处理异常的方式,而不是练习这样的巫术。修复的代码可能如下所示:

catch(Exception ex)
{
    CloseLoadingScreen();
    MessageBox.Show(ErrorNumber);
}
我的意思是,你可以自由探索窗户挂钩之类的东西,只是你选择了一个糟糕的场合


编辑:我认为重构代码的正确方法是实现一个实体,其唯一目的是通知用户重要的内容。该实体将了解加载屏幕状态和其他相关内容,并根据此上下文执行一组操作(显示消息框、写入日志、关闭加载屏幕等)。然后,您可以在需要发送通知时使用此实体。这样,您就不必在需要更改通知逻辑时遍历所有catch语句。它可以是一个简单的访问。

虽然你可能渴望了解更多关于窗口句柄和钩子等,但是你也必须考虑好的编码实践。我怀疑你提出的方法是否是一个正确的解决方案。是的,但这意味着我将不得不更改大量的异常代码。。。这就是为什么我希望用一个函数来解决这个问题。但你是对的,我对异常处理得不太好。我同意尼基塔的回答。我继承了一个相当大的Winforms代码库,我不得不做一些类似的事情——我尝试用MDI做一些魔术,但它最终导致的问题多于解决方案。最后,我检查了整个代码库中所有的MessageBox.Show()和CustomForm.ShowDialog()调用,并“手动”处理了这个问题。@rvgiesen,你说得对。您没有很好地处理异常。越早解决这个问题越好。你建议的解决方案不是修复方案,而是解决方案,最终会让你付出代价。好吧,我会站在安全的角度,重新记录我所有的捕获块。谢谢在EnterThreadModal的MSDN文章中,该示例显示了事件发生时的MessageBox。我原以为这会再次引发事件,导致无限的MessageBox——但我只是尝试了一下,结果只显示了一次。为什么会这样?更新:我在LeaveThreadModal事件中尝试了相同的方法。在本例中,它确实会生成infite messagebox。这很奇怪,因为Enter事件“没有发生”——有人能解释吗?