c# - 如何隐藏 Owner 最小化后显示的 Owned 窗口?

标签 c# wpf windows winapi

我知道 Owned windows 之间的契约(Contract)和他们的所有者,并且当所有者被隐藏时,拥有的窗口也被隐藏。这实际上是我想要的。问题是,如果您在所有者窗口最小化后 显示一个自有窗口,则自有窗口不会隐藏,而是正常显示在屏幕上。在这种情况下,窗口的 WindowState 在启动时被最小化,因此显示的任何拥有的窗口都会显示在屏幕上。

我知道我可以调用ShowOwnedPopups强制操作系统隐藏所有拥有的窗口,但这似乎只在实际显示拥有的窗口后才起作用,因此屏幕上会闪烁。我已经尝试显式隐藏窗口(例如,删除 WS_VISIBLE 位或尝试更改 WM_SHOWCOMMAND 以使其显示为隐藏),但是当所有者恢复时,拥有的窗口不可见。这与 ShowOwnedPopups API 的文档一致,其中唯一可见的窗口是那些被 ShowOwnedPopups 调用隐藏的窗口。

所以我正在寻找某种方法让操作系统以这样一种方式显示窗口,即在所有者恢复之前它不会对最终用户可见 - 或者 - 一种在窗口上设置标志的方法这样操作系统认为它使用 ShowOwnedPopups 隐藏了窗口,然后我将手动隐藏窗口并设置该标志。

请注意,显示拥有的窗口的代码与外壳无关,因此在恢复所有者之前不显示拥有的窗口并不是一件简单的事情。这是一个单独的自定义控件的一部分,在本例中它恰好是一个 WPF 控件,因此该控件甚至可以在 ElementHost 中使用,所以我也不能只监视所属窗口的 WindowState。不过欢迎使用任何 Windows API 解决方案。

最佳答案

作为一个小技巧(我之前在我的一个项目中使用过),我建议在可见区域之外创建窗口,最小化并在最小化时再次将其位置移动到可见区域。检查下面的代码。

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    var w = new Window();   // Create window
    w.Owner = this;         // Set this window as owner
    w.WindowStartupLocation = System.Windows.WindowStartupLocation.Manual; // Set startup location as manual
    w.Left = -10000;        // Set x position to -10000 (or anything which makes it out of bounds)
    w.Top = -10000;         // Set y position to -10000
    w.Show();               // Show window (it will not be shown, not even blink)
    w.WindowState = System.Windows.WindowState.Minimized;   // Set window as minimized
    w.Left = 100;           // Set x position to 100 (or whatever you want)
    w.Top = 100;            // Set y position to 100 (or whatever you want)
}

关于c# - 如何隐藏 Owner 最小化后显示的 Owned 窗口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9379808/

相关文章:

c# - 反序列化时重新映射单个标签

c# - 检查一个 IList 改变了吗?

wpf - 无法访问多值转换器中的数据上下文

windows - 如何在 Pascal Script/Inno Setup 中使用 WinAPI 中的 PathCombine()?

c# - 更改 CheckedListBox ItemsSource

c# - 如何使用 C# 使用 HttpClient 发布 JSON?

c# - 后台工作人员重用错误 C#

c# - Visual Studio 2015 属性面板

c# - WPF:ComboBox 中的多种前景色

windows - 不区分大小写的文件系统上的区分大小写的文件困扰着存储库