如何隐藏所有者最小化后显示的拥有窗口?

时间:2012-02-21 15:03:52

标签: c# wpf windows winapi

我知道Owned windows和他们的所有者之间的合同,并且隐藏所有者时隐藏了拥有的窗口。这实际上就是我想要的。问题是,如果在之后显示一个拥有的窗口,所有者窗口最小化,那么拥有的窗口不会被隐藏,而是在屏幕上正常显示。在这种情况下,Window的WindowState在启动时最小化,因此显示的任何Owned窗口都会显示在屏幕上。

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

所以我正在寻找某种方法让操作系统以这样的方式显示窗口,直到所有者恢复后才能让最终用户看到它 - 或者 - 在窗口上设置标志的方法因此操作系统认为它使用ShowOwnedPopups隐藏了窗口,然后我将手动隐藏窗口并设置该标志。

注意,显示Owned窗口的代码与shell没有关联,因此在恢复所有者之前不显示拥有的窗口并不是一件简单的事情。这是一个单独的自定义控件的一部分,在这种情况下,它恰好是一个WPF控件,因此控件甚至可以在ElementHost中使用,所以我不能只关注拥有窗口的WindowState。欢迎使用任何Windows API解决方案。

1 个答案:

答案 0 :(得分:0)

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

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)
}