Как скрыть окно «Владелец», отображаемое после сворачивания «Владелец»? - PullRequest
4 голосов
/ 21 февраля 2012

Я знаю о договоре между Владеющими окнами и их Владельцем и о том, что Собственные окна скрыты, когда Владелец скрыт.Это на самом деле то, что я хочу.Проблема заключается в том, что если вы показываете окно «Владелец» после , то окно «Владелец» сворачивается, тогда окно «Владелец» не скрывается, а отображается нормально на экране.В этом случае WindowState окна свернут при запуске, поэтому любое отображаемое окно Owned отображается на экране.

Я знаю, что могу вызвать ShowOwnedPopups , чтобы заставить ОС скрытьсявсе окна Owned, но это, кажется, работает только после того, как окно Owned было фактически показано, таким образом, вы получаете мерцание на экране.Я попытался явно скрыть окно (например, удалив бит WS_VISIBLE или пытаясь изменить WM_SHOWCOMMAND так, чтобы оно отображалось скрытым), но затем окно Owned не становится видимым при восстановлении владельца.Это согласуется с документацией по API ShowOwnedPopups, согласно которой единственными окнами, которые становятся видимыми, являются те, которые скрыты вызовом ShowOwnedPopups.

Так что я ищу какой-либо способ, чтобы ОС показывала окно в таком видеспособ, которым он не будет виден конечному пользователю, пока владелец не будет восстановлен, или способ установить флаг в окне, чтобы ОС думала, что она скрыла окно, используя ShowOwnedPopups, а затем я вручную скрою окно и установлюэтот флаг.

Обратите внимание, что код, показывающий окна Owned, не связан с оболочкой, поэтому непросто не показывать окно Owned, пока владелец не будет восстановлен.Это часть отдельного пользовательского элемента управления, и в данном случае это элемент управления WPF, поэтому элемент управления можно использовать даже в ElementHost, поэтому я не могу просто наблюдать за WindowState окна-владельца.Любое решение Windows API приветствуется.

1 Ответ

0 голосов
/ 21 февраля 2012

В качестве небольшого подвоха (который я использовал ранее в одном из моих проектов) я предлагаю создать окно за пределами видимой области, свернуть и снова переместить его положение в видимую область, когда оно свернуто. Проверьте код ниже.

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)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...