c # - Sådan skjuler du et ejet vindue, der vises efter ejeren er minimeret?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg ved om kontrakten mellem egne vinduer og deres ejer og at de ejede vinduer er skjulte, når ejeren er skjult. Dette er faktisk hvad jeg vil have. Problemet er, at hvis du viser et eget vindue efter , er ejervinduet minimeret, så er det ejede vindue ikke skjult, men vises normalt på skærmen. I dette tilfælde er WindowState i vinduet minimeret ved opstart, så et ejet vindue, der vises, vises på skærmen. [2]


Jeg ved, at jeg kan ringe til ShowOwnedPopups for at tvinge OS'et til at skjule alle de egne vinduer, men det ser kun ud til at arbejde, efter at det egnede vindue faktisk er blevet vist, så du får en flimmer på skærmen. Jeg har forsøgt at skjule vinduet eksplicit (f.eks. Fjernelse af WS\_VISIBLE-bit eller forsøger at ændre WM\_SHOWCOMMAND sådan, at den vises skjult), men det eget vindue bliver ikke synligt, når ejeren er gendannet. Dette er i overensstemmelse med dokumentationen for ShowOwnedPopups API, hvorved de eneste vinduer, der er synlige, er dem, der er skjult af ShowOwnedPopups-opkaldet. [3]


Så jeg leder efter en eller anden måde at få OS'et til at vise vinduet på en sådan måde, at det ikke bliver synligt for slutbrugeren, før ejeren genoprettes - eller en måde at sætte et flag på vinduet, så at OS synes at skjule vinduet ved hjælp af ShowOwnedPopups, og så vil jeg manuelt skjule vinduet og sætte det flag.


Bemærk, at koden, der viser de egne vinduer, ikke er forbundet med skallen, så det er ikke et simpelt spørgsmål om ikke at vise det ejede vindue, før ejeren er gendannet. Dette er en del af en separat brugerkontrol, og i dette tilfælde forekommer det at være en WPF-kontrol, så kontrollen kan endda bruges i et ElementHost, så jeg kan ikke bare kigge på WindowState i ejervinduet. Enhver Windows API-løsning er velkommen dog.

Bedste reference


Som et lille beskidt trick (som jeg tidligere har brugt på et af mine projekter), foreslår jeg at skabe vinduet uden for det synlige område, minimere og flytte dets position til synligt område igen, når det minimeres. Tjek koden nedenfor.


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