c ++ - GetWindowPlacement giver den forkerte vinduesposition

Indlæg af Hanne Mølgaard Plasc

Problem



Sådan finder du ud af, om et vindue blev ændret ved hjælp af Aero Snap-funktionen? GetWindowPlacement funktionen giver den nyeste 'restaureret' vinduestørrelse. Jeg bruger det som følger: [12] [13]


WINDOWPLACEMENT wp = {};
wp.length = sizeof(WINDOWPLACEMENT);
::GetWindowPlacement( hWnd, &wp );


For eksempel giver det wp.rcNormalPosition = {top=208 bottom=520 left=152 right=510}, når det skal være
{top=0 bottom=1920 left=152 right=510}.


Vær opmærksom på at GetWindowRect giver det samme forkerte resultat. Det var min skyld, GetWindowRect giver det rigtige resultat.


Jeg skal gemme vinduetilstand på programafslutningen og indlæse det på start, så jeg har brug for at vide, hvordan vinduer er placeret. Hvordan kan jeg finde ud af faktiske vinduekoordinater?





Nå har jeg lavet flere tests med notepad.exe (og nogle andre standard Windows-komponenter) og det gemmer sin tilstand på samme måde — det husker ikke, om det var 'snappet'. Så jeg antager, at dette er meningen med Windows-programmer.

Bedste reference


AeroSnap er bare en anden type resize sendt til din app af vindueschefen. Som sådan forstår du ikke, at det var snappe snarere end nogen anden form for resize.


Det bedste du kan håbe på er at opdage, at modsatte kanter er blevet flyttet i løbet af en størrelsesbegivenhed. Du skal kontrollere, at højden eller bredden er ændret til at skelne den fra en bevægelsesbegivenhed.


Grunden til at du ikke får at vide, at dette er et snap er, at det er svært at forestille sig, hvorfor en app ville bryde sig om, hvad mekanismen til resizing er.





Kommentarerne har afsløret mere om dit problem. Du forsøger at fortsætte din apps position og størrelse, når appen lukker ned, så du kan gendanne den, når den genstarter. Du bruger GetWindowPlacement() for at gøre det, og har opdaget, at det returnerer en forkert position, når vinduets sidste dimensionering var en Aero Snap.


Min egen app gør præcis det samme, og jeg har stødt på det samme problem. Den løsning, jeg brugte, var at kalde GetWindowRect() i stedet for GetWindowPlacement() for at opnå vinduets position og størrelse. Du siger, at dette mislykkes for dig, i hvilket tilfælde jeg ikke har nogen idé om, hvad jeg skal foreslå. Jeg må sige, at jeg finder det lidt svært at tro, at GetWindowRect() ikke returnerer det korrekte vindue rekt.