Ik ben bezig met het schrijven van een appbar (applicatie die docked aan een zijkant van je scherm). Deze wil ik doorzichtig maken in Vista op het moment dat er geen vensters gemaximaliseerd zijn. Net zoals dat bij de taskbar gebeurt. Door een Windows Api aan te roepen kan ik mezelf wel registreren voor het event dat afgaat als er een windows maximaliseerd word en als er geen enkel window meer gemaximaliseerd is:
Dit werkt prima! Maar.... als ik m'n applicatie start weet ik niet of ik nou wel of niet doorzichtig moet tekenen. Pas op het moment dat ik voor het eerst het WM_DWMWINDOWMAXIMIZEDCHANGE message krijg weet ik wat de state is. Maar dit kan 'uren' duren. Ik zoek dus naar een mogelijkheid om bij het opstarten waarde ISDWMWINDOWMAXIMIZED ofzo iets te krijgen.
Op dit moment maak ik gebruik van een workaround. Ik ga alle vensters af en kijk of deze versters gemaximaliseerd zijn en zichtbaar zijn, dan weet ik ook of het form opaque moet zijn of niet. Maar dit lijkt me nogal omslachtig:
De vraag is dus of iemand een betere manier weet om bij het starten van m'n app de waarde van WM_DWMWINDOWMAXIMIZEDCHANGE te krijgen.
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| public SomeFormConstructor() { //Win32 Struct VistaApi.DWM_BLURBEHIND bbh = new VistaApi.DWM_BLURBEHIND(); bbh.fTransitionOnMaximized = true; bbh.dwFlags = VistaApi.DWM_BB_TRANSITIONONMAXIMIZED; //Call to Win32 Api VistaApi.DwmEnableBlurBehindWindow(this.Handle, ref bbh); } protected override void WndProc(ref Message msg) { //catch + handle message if (msg.Msg == VistaApi.WM_DWMWINDOWMAXIMIZEDCHANGE) { Console.Out.WriteLine("WM_DWMWINDOWMAXIMIZEDCHANGE"); if (msg.WParam.ToInt32() == 1) SetOpaquacyState(true); else SetOpaquacyState(false); } base.WndProc(ref msg); } |
Dit werkt prima! Maar.... als ik m'n applicatie start weet ik niet of ik nou wel of niet doorzichtig moet tekenen. Pas op het moment dat ik voor het eerst het WM_DWMWINDOWMAXIMIZEDCHANGE message krijg weet ik wat de state is. Maar dit kan 'uren' duren. Ik zoek dus naar een mogelijkheid om bij het opstarten waarde ISDWMWINDOWMAXIMIZED ofzo iets te krijgen.
Op dit moment maak ik gebruik van een workaround. Ik ga alle vensters af en kijk of deze versters gemaximaliseerd zijn en zichtbaar zijn, dan weet ik ook of het form opaque moet zijn of niet. Maar dit lijkt me nogal omslachtig:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
| private List<IntPtr> OpenWindows = new List<IntPtr>(); private void CheckMaximizeStatus() { OpenWindows.Clear(); WinApi.EnumWindowsProc callback = new WinApi.EnumWindowsProc(EnumWindows); WinApi.EnumWindows(callback, 0); bool showMaximized = false; foreach (IntPtr window in OpenWindows) { WinApi.WINDOWPLACEMENT placement = new WinApi.WINDOWPLACEMENT(); placement.length = Marshal.SizeOf(placement); WinApi.GetWindowPlacement(window, ref placement); bool maximized = (placement.showCmd & (int)WinApi.WINDOWPLACEMENT_showCmd.SW_MAXIMIZE) == (int)WinApi.WINDOWPLACEMENT_showCmd.SW_MAXIMIZE; bool visible = WinApi.IsWindowVisible(window); if (maximized && visible) { //Debug.WriteLine(GetText(window)); showMaximized = true; break; } } SetOpaquacyState(showMaximized); } private bool EnumWindows(IntPtr hWnd, int lParam) { OpenWindows.Add(hWnd); return true; } |
De vraag is dus of iemand een betere manier weet om bij het starten van m'n app de waarde van WM_DWMWINDOWMAXIMIZEDCHANGE te krijgen.