C# MessageBox是桌面的模态

C# MessageBox是桌面的模态,c#,winforms,messagebox,C#,Winforms,Messagebox,我正在开发我的第一个WinForms应用程序…我通常编写web应用程序 今天我的申请发生了一件奇怪的事情。如果我在我的计算机上运行应用程序,或者我的同事在他的计算机上运行应用程序,那么我的消息框仅适用于我的应用程序。这是理想的行为。如果出现消息框,我的用户需要能够在单独的应用程序中进行手动编辑,单击消息框中的“确定”将“取消暂停”我的应用程序并允许他们继续 今天下午,我们刚刚在两个终端用户的计算机上安装了应用程序的beta版,出于某种原因,当我们在他们的任何一台计算机上运行应用程序时,消息框都是

我正在开发我的第一个WinForms应用程序…我通常编写web应用程序

今天我的申请发生了一件奇怪的事情。如果我在我的计算机上运行应用程序,或者我的同事在他的计算机上运行应用程序,那么我的消息框仅适用于我的应用程序。这是理想的行为。如果出现消息框,我的用户需要能够在单独的应用程序中进行手动编辑,单击消息框中的“确定”将“取消暂停”我的应用程序并允许他们继续

今天下午,我们刚刚在两个终端用户的计算机上安装了应用程序的beta版,出于某种原因,当我们在他们的任何一台计算机上运行应用程序时,消息框都是桌面的模态-在单击“确定”之前,其他任何内容都无法接收焦点。这种行为给我的应用程序带来了一个巨大的问题

我不知道用户的机器上会有什么不同导致这种行为。 我的计算机-Win7 64位,我同事的计算机-Win7 32位,两个用户的计算机是Win7 32位。都安装了.Net Framework 4.5或4.5.1

有什么建议吗


更新:

2014.11.17-代码片段

DialogResult result = MessageBox.Show("The Style field did not pass validation.  
                      Please manually fix the data then click OK to continue.", 
                      "WARNING", MessageBoxButtons.OK, 
                      MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1);

如果汉斯·帕桑(Hans Passant)发布了一个答案而不是评论,我会将他的回答标记为答案

我就是这样解决这个问题的:

DialogResult result = MessageBox.Show(t2tWindow, "The Style field did not pass 
                      validation.  Please manually fix the data then click OK 
                      to continue.", "WARNING", MessageBoxButtons.OK, 
                      MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1);

此代码位于单独的“实用程序”类中,而不是表单的代码隐藏中,因此我必须将
IWin32Window
参数传递到方法中,以便将其传递到
Show()
方法。

您是否尝试过MessageBox中的
SetForeGround
函数
MsgBox(“Message”,MsgBoxStyle.惊叹号+MsgBoxStyle.MsgBoxSetForeground,“Title”)
@Alex MsgBoxSetForeground做什么?我在MSDN上找到的那个简短的小广告对我来说解释得不够好。它应该对你的留言框做一种“带到最前面”的功能。这样,它就不应该是桌面上的模式,而是在最新打开的应用程序窗口上。如何显示您的消息框?哪一行代码可以做到这一点?@Alex我会在更新帖子时回答问题,这样我们就不会在评论中进行长时间的对话。这在技术上是可行的。消息框窗口需要一个所有者窗口。如果您自己没有指定它,那么它将尝试使用GetActiveWindow()查找一个。如果没有,那么它可以选择桌面窗口,使自己成为桌面所有的每个窗口的模态。你必须做一些非常奇怪的事情才能没有一个活动的窗口,你根本没有留下面包屑来猜测这是怎么发生的。通过使用带有所有者参数的Show()重载,可以更具体一些。