MessageBox对桌面具有模态特性。

5

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

今天我的应用程序出现了奇怪的问题。如果我在我的计算机上运行该应用程序,或者我的同事在他的计算机上运行它,我的MessageBoxes仅对我的应用程序模态。这是期望的行为。如果出现消息框,我的用户将需要在单独的应用程序中进行手动编辑,点击“确定”按钮将“暂停”我的应用程序并允许他们继续。

今天下午我们刚刚安装了应用程序的测试版到两个最终用户的计算机上,但不知何故,当我们在他们的计算机上运行应用程序时,消息框会模态于桌面,直到单击“确定”之前,不允许任何其他东西获得焦点。这种行为给我的应用程序带来了巨大的问题。

我不知道在这些用户的计算机上可能有什么不同的地方,导致这种情况的发生。我的电脑- 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);

你尝试过在MessageBox中使用SetForeGround函数吗? MsgBox(“Message”,MsgBoxStyle.Exclamation + MsgBoxStyle.MsgBoxSetForeground,“Title”) - Alex
@Alex,MsgBoxSetForeground是做什么的?我在MSDN上找到的简短介绍并没有很好地解释它。 - CDR12
它应该对您的MessageBox执行一种类似于“Bring to front”的操作。这样它不应该成为桌面上的模态,而是在最新打开的应用程序窗口上。您如何显示消息框?哪一行代码会这样做? - Alex
@Alex 我会在帖子中更新回答问题,这样我们就不必在评论区进行长时间的对话了。 - CDR12
5
这在技术上是可能的。消息框窗口需要一个所有者窗口。如果您没有自己指定,则它将尝试使用GetActiveWindow()找到一个窗口。如果没有窗口,则可以选择桌面窗口,使自己对由桌面拥有的每个窗口都是模式化的。你必须要做一些非常奇怪的事情才能没有活动窗口,完全没有线索可以猜测发生了什么。通过具体说明,使用带有owner参数的Show()重载来提前。 - Hans Passant
1个回答

1
如果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()方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接