c + + - vindue maksimalt maksimere

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg søger at oprette et program, hvor jeg kan indstille maksimal maksimal størrelse (som i størrelsen vinduet maksimerer til, når du rammer maksimeringsknappen) og maksimere position (X/Y koordineret for det maksimerede vindue) for alle de vinduer, der kører. Dette er sådan, at jeg altid kan se min regnmåler på min sekundære skærm uden at skulle manuelt ændre størrelsen på hvert vindue, der passer ind i det.


Jeg har formået at gøre dette til et simpelt program, jeg skrev ved hjælp af MINMAXSIZE fra WinAPI. Denne metode ser ud til at fungere perfekt til mit lille program, men der er meget lidt dokumentation på det ved siden af ​​1 eller 2 artikler på internettet. Jeg spekulerede på, om det ville være den bedste måde at indstille maksimalt maksimere størrelse på, eller hvis der er en anden måde at gøre dette på.


De måde, jeg planlagde at gennemføre dette på i alle applikationerne, ville være enten DLL-injektion eller kroge (hvoraf ingen har nogen erfaring med), så jeg undrede også jeres tanker om disse metoder.


Jeg ved, at der er et par applikationer derude, der allerede gør det, men jeg troede det kunne være en lærerig oplevelse, og også alle de programmer, jeg forsøgte, virker ikke rigtig godt (selvom det kunne være tilfældet med dem alle på grund af den måde, som Windows fungerer).


Hvis nogen af ​​jer stadig er usikre på, hvad jeg taler om, gør MaxMax præcis det, jeg vil have (selvom det ikke fungerer så godt som jeg sagde i mit tidligere afsnit). [7]


Mange tak på forhånd.

Bedste reference


Hvad du vil gøre, er at bruge en global windows-krog til at håndtere WM\_GETMINMAXINFO. Som du måske er opmærksom på, er dette meddelelsen, der er: [8]



  Sendes til et vindue, når vinduets størrelse eller placering er ved at
  lave om. En applikation kan bruge denne meddelelse til at tilsidesætte vinduet s
  standardmaksimeret størrelse og position, eller standardminimum eller maksimum
  sporingsstørrelse.



Den bedste måde at bruge dette på for at overstyr standardstandarden er at udfylde MINMAXINFO-strukturen som sådan: [9]


case WM\_GETMINMAXINFO: {
  DefWindowProc(hWnd, message, wParam, lParam);
  MINMAXINFO* mmi = (MINMAXINFO*)lParam;
  mmi->ptMaxTrackSize.x = 100;
  mmi->ptMaxTrackSize.y = 100;
  return 0;
}


Dette vil tillade, at standardværdierne tildeles de størrelser, du ikke bekymrer dig om (min x/y) i dette tilfælde, hvilket giver dig mulighed for at fyre med de maksimale værdier, som du vil. Din Windows-krog skal ske med SetWindowsHookEx () og skulle se sådan ud: [10]


SetWindowsHookEx(WH\_CALLWNDPROC, hook\_procedure, instance\_handle, 0);


hMod (instance\_handle) bør kun indstilles afhængigt af omstændighederne (se dokumenterne herfor). Den tredje mandat giver en global krog. Din CallWndProc kan se sådan ud:


\_\_declspec(dllexport) LRESULT WINAPI CallWndProc(int nCode, WPARAM wParam, LPARAM lParam) {
  CWPSTRUCT* cwp = (CWPSTRUCT*)lParam;
  if(WM\_GETMINMAXINFO == cwp->message) {
    DefWindowProc(hWnd, message, wParam, lParam);
    MINMAXINFO* mmi = (MINMAXINFO*)lParam;
    mmi->ptMaxTrackSize.x = 100;
    mmi->ptMaxTrackSize.y = 100;
    return 0;
  }

  return CallNextHookEx(next\_hook, nCode, wParam, lParam);
}


Desværre er noget, du skal håndtere, at de eneste vinduer, der bliver tilsluttet, er dem, der havde eksisteret, da du ringede til SetWindowsHookEx (). Jeg er ikke klar over en ren måde at komme forbi dette, uden at ringe et opkald til SetWindowsHookEx () (ergh!).


Du kan potentielt gøre dette med DLL-injektion og effektivt underklasse hvert vindue med EnumWindows, EnumChildWindow og SetWindowLongPtr/SetWindowSubclass. Men hvorfor gå til alle de problemer, når du bare kunne bruge SetWindowsHookEx? :) [11] [12] [13] [14]


For at ændre x/y kan du muligvis tilføje en tilsidesættelse for WM\_SYSCOMMAND og tjekke efter SC\_MAXIMIZE, og brug derefter SetWindowPos/MoveWindow til at placere det korrekt (hvis du ikke vil have det på standard 0, 0). [15] [16] [17]

Andre referencer 1


Hvad du sandsynligvis leder efter, er indstillingen arbejdsområde , som du kan indstille/hente med funktionen SystemParametersInfo, kaldet med flagerne SPI\_SETWORKAREA/SPI\_GETWORKAREA . [18]