如何隐藏最小化所有者后显示的“拥有”窗口
本文关键字:显示 拥有 窗口 所有者 何隐藏 隐藏 最小化 | 更新日期: 2023-09-27 18:25:22
我知道Owned windows和它们的所有者之间的合同,并且当所有者被隐藏时,Owned窗口被隐藏。这正是我想要的。问题是,如果在之后显示Owned窗口,则Owner窗口最小化,则Owned窗不会隐藏,而是正常显示在屏幕上。在这种情况下,窗口的WindowState在启动时被最小化,因此显示的任何Owned窗口都会显示在屏幕上。
我知道我可以调用ShowOwnedPopup来强制操作系统隐藏所有Owned窗口,但这似乎只有在Owned窗户实际显示后才能工作,所以屏幕上会闪烁。我曾尝试显式隐藏该窗口(例如,删除WS_VISIBLE位或尝试更改WM_SHOWCOMMAND以使其显示为隐藏),但在还原所有者时,Owned窗口不可见。这与ShowOwnedPopups API的文档一致,根据该文档,只有ShowOwned Popups调用隐藏的窗口才可见。
因此,我正在寻找一种方法,要么让操作系统显示窗口,使其在所有者恢复之前对最终用户不可见,要么在窗口上设置标志,使操作系统认为它使用ShowOwnedPopup隐藏了窗口,然后我将手动隐藏窗口并设置该标志。
注意,显示Owned窗口的代码与shell没有关联,因此在所有者恢复之前不显示Owne窗口并不是一个简单的问题。这是一个单独的自定义控件的一部分,在这种情况下,它恰好是一个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)
}