保留对 MessageBox 的引用?

Keep a reference to MessageBox?

我试图在用户会话超时时隐藏我的应用程序的所有 windows。效果很好;但是,当应用程序超时时 MessageBox 保持打开状态,消息框仍然存在。我希望能够关闭消息框或至少隐藏它。我已经查找了 hwnds 和 hinstances,但我不太清楚这是否是我想要实现的目标。我认为这会相当容易,因为我认为 MessageBox 继承自 Window,当然事实并非如此。最重要的是,您无法创建消息框实例来跟踪它。在这一点上,我不确定实际做什么或实际搜索什么。

我正在尝试使用反射来解决一些问题。我可以使用反射创建 MessageBox 的实例,但我认为我不能使用实例调用 Show()。

简短回答:只需创建您自己的 window 看起来像消息框的

长答案:

消息框是普通的 WinAPI windows(它们有一个 HWND 并且可以由本机 API windowing 函数操作)但是它们不是 WPF windows 并且没有关联的 Window 对象。

因为它们是正常的windows你可以得到它们的HWND(使用FindWindow/FindWindowEx/EnumWindows)并欺骗它们关闭(例如,通过模拟取消按钮点击)

但是,由于消息框的设计目的不是像那样进行操作,所以这个技巧有一些您必须注意的令人讨厌的陷阱。

而且,由于消息框非常简单,您可以轻松地创建一个消息框克隆,因此创建关闭更容易,而无需处理所有消息框的极端情况。