Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[C#/W32] Is er een scherm gemaximaliseerd

Pagina: 1
Acties:

  • remyblok
  • Registratie: Oktober 2003
  • Laatst online: 09:03
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:

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.

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 18-11 23:16

TeeDee

CQB 241

Misschien een andere workaround: Voor het sluiten van je applicatie sla je de Size, Location en WindowState op in een ApplicationSettings.

Vervolgens bij het opstarten lees je die uit en hoef je vooralsnog dit niet op te lossen met een WndProc.

Heart..pumps blood.Has nothing to do with emotion! Bored


  • remyblok
  • Registratie: Oktober 2003
  • Laatst online: 09:03
Het gaat er juist om of ándere venster gemaximaliseerd zijn. Voor m'n eigen venster kan ik inderdaad die waarde opslaan. Echter zegt de WindowState niets over de andere windows op het moment dat ik later de applicatie start.
De waarde die de Opaquacy heeft bij het sluiten hoeft niet dezelfde te zijn als bij het openen, omdat het dus ligt aan de toestand van de andere vensters die geopend zijn.

  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 31-10 11:58
Op zich lijkt me je oplossing geen probleem. Volgens mij moet je alleen ook nog rekening houden met als 2 schemen gemaximaliseerd zijn en 1 daarvan minimized wordt. Zoals ik nu kan zien pas je dan namelijk ook je opacity al aan.

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


  • remyblok
  • Registratie: Oktober 2003
  • Laatst online: 09:03
Er word gekeken of er een window maximized is. Maakt op zich niet uit of het er 1 of 10 zijn. Als er eentje wordt geminimized zijn er nog 9 ander die maximized zijn. Ik de siutatie die je voorstelt al getest en niet opgemerkt dat het fout gaat.

Maar je hebt gelijk dat het opzicht geen probleem is om deze oplossing te gebruiken, het werkt zoals verwacht. Maar het klinkt nogsteeds omslachtig. Ik vind het zo vreemd dat er geen simpele api-call is om zoiets uit te vragen, of ik moet 'em nog niet gevonden hebben.

  • remyblok
  • Registratie: Oktober 2003
  • Laatst online: 09:03
Is er echt niemand die nog iets slims weet? Ik blijf maar zo'n gevoel houden dat dat 2e stuk code ook simpeler moet kunnen. Er zijn vast meer mensen die willen weten of schermen gemaximaliseerd zijn of niet.
MS bied met die WM_DWMWINDOWMAXIMIZEDCHANGE al een functie om de waarde te krijgen als deze veranderd, waarom dan geen manier op de waarde op te vragen op elk moment.

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Ik ben niet helemaal op de hoogte van de verschillende api's, maar kun je niet gewoon de handle van de taskbar achterhalen en nagaan of de taskbar zichtbaar is?

If it isn't broken, fix it until it is..


  • remyblok
  • Registratie: Oktober 2003
  • Laatst online: 09:03
Je hebt me inderdaad op het goede spoor gezet. Ik ben gaan zoeken of ik inderdaad van de taskbar kan opvragen of 'ie transpartant of opaque is. Ben uiteindelijk op de volgende site uit gekomen.
Hier stond het volgende stukje code. Ik heb het nog niet geprobeert (even wachten tot ik thuis ben), maar het lijkt erop dat het 't goede resultaat gaat gegeven.
Applications can determine whether composition is opaque or translucent as well as the composition color by calling the DwmGetColorizationColor function as follows:

C++:
1
2
3
4
5
Gdiplus::ARGB color = 0;
BOOL opaque = FALSE;

HRESULT result = ::DwmGetColorizationColor(&color,
                                           &opaque);

  • Face_-_LeSS
  • Registratie: September 2004
  • Niet online
Is het niet mogelijk om door alle windows heen te lopen en per stuk op te vragen wat de "staat" is?

"GetWindowPlacement" zie in staan op Microsofts site. Misschien is dat wat je zoekt?

  • remyblok
  • Registratie: Oktober 2003
  • Laatst online: 09:03
Dat is inderdaad wat ik nu doe, zie code voorbeeld 2 uit de startpost. Het lijkt mij dus dat er *iets* makkelijkers moet zijn.... Misschien ook wel niet

  • Face_-_LeSS
  • Registratie: September 2004
  • Niet online
Doh :X Laat ik de volgende keer eens goed lezen voor dat ik reageer.

Ik vind het niet echt omslachtig, het is zelf een best nette manier denk ik.
Waarom moest het makkelijker? Gaat het niet snel genoeg?

Verwijderd

remyblok schreef op vrijdag 25 april 2008 @ 15:54:
Je hebt me inderdaad op het goede spoor gezet. Ik ben gaan zoeken of ik inderdaad van de taskbar kan opvragen of 'ie transpartant of opaque is. Ben uiteindelijk op de volgende site uit gekomen.
Ik denk dat dat niet betrouwbaar is aangezien gebruikers aan kunnen geven of ze transparante window borders (inclusief taks bar) willen hebben.

Ik zou het houden op je eigen oplossing. Kost ook nauwelijks tijd.
Pagina: 1