Quelltext /~heha/hs/makevis.zip/src/makevis.cpp

// Schon erfunden: https://github.com/gurrhack/RestoreWindows
// Aber eigentlich ist RestoreWindows ein DIENST!
// Hier umstrukturiert um nicht von der riesigen msvcrt140.dll abhängig zu sein:
// http://www.tu-chemnitz.de/~heha/hs/RestoreWindows.zip

// Dieses Programm zieht sämtliche Fenster in das Hauptfenster.
// Nützlich wenn mehrere Monitore angesteckt aber nicht eingeschaltet sind.
// Denn Windows weiß nichts von ausgeschalteten Monitoren.

#define _WIN32_WINNT 0x0500
#include <windows.h>

#define elemof(x) (sizeof(x)/sizeof(*(x)))

class Makevis{
 RECT rects[8];
 size_t nrects;
 bool forceFullInside;	// Fenster komplett in einen(?) Monitor ziehen und ggf. verkleinern, sonst nur Systemmenü greifbar machen; sonst nur bei SW_MAXIMIZED verkleinern
 static BOOL CALLBACK EnumProc(HWND w,LPARAM lp) {return ((Makevis*)lp)->EnumProc(w);}
 BOOL EnumProc(HWND Wnd) {
  if (IsWindowVisible(Wnd)) {	// Fenster mit SW_HIDE nicht beachten
   WINDOWPLACEMENT wp;
   wp.length=sizeof wp;
   GetWindowPlacement(Wnd,&wp);
   for (size_t i=0; i<nrects; i++) {
    RECT&R=rects[i];
    if (wp.showCmd==SW_MAXIMIZE) {
     if (wp.ptMaxPosition.x==R.left && wp.ptMaxPosition.y==R.top) goto okay;	// TODO: Größe bei Auflösungsänderung checken
    }else{
     RECT&r=wp.rcNormalPosition;
     if (forceFullInside) {
      if (R.left<=r.left && r.right<=R.right
       && R.top<=r.top && r.bottom<=R.bottom) goto okay;
     }else{
      if (R.left<=r.left && r.left+32<=R.right
       && R.top<=r.top && r.bottom+32<=R.bottom) goto okay;
     }
    }
   }
   if (wp.showCmd==SW_MAXIMIZE) {
    wp.ptMaxPosition.x=rects[0].left;
    wp.ptMaxPosition.y=rects[0].top;
   }else if (forceFullInside) {
    OffsetRect(&wp.rcNormalPosition,
      rects[0].left-wp.rcNormalPosition.left,
      rects[0].top-wp.rcNormalPosition.top);
    if (wp.rcNormalPosition.right>rects[0].right) wp.rcNormalPosition.right=rects[0].right;
    if (wp.rcNormalPosition.bottom>rects[0].bottom) wp.rcNormalPosition.bottom=rects[0].bottom;
   }
   wp.flags|=WPF_ASYNCWINDOWPLACEMENT;
   SetWindowPlacement(Wnd,&wp);	// Ob Windows wohl den Rest macht?
okay:;
  }
  return true;
 }
 static BOOL CALLBACK MonitorEnumProc(HMONITOR hMon,HDC,RECT*,LPARAM lp) {return ((Makevis*)lp)->MonitorEnumProc(hMon);}
 BOOL MonitorEnumProc(HMONITOR hMon) {
  MONITORINFO mi;
  mi.cbSize=sizeof mi;
  if (GetMonitorInfo(hMon,&mi) && nrects<elemof(rects)) {
   CopyRect(rects+nrects++,&mi.rcWork);	// Arbeitsbereiche einsammeln
  }
  return true;
 }
public:
 UINT operator()(bool fullInside=false) {
  nrects=0;
  forceFullInside=fullInside;
  if (!EnumDisplayMonitors(0,0,MonitorEnumProc,(LPARAM)this)) return 5;
  if (!nrects) return 6;
  if (!EnumWindows(EnumProc,(LPARAM)this)) return 7;
  return 0;
 }
};

void _cdecl WinMainCRTStartup() {
 Makevis makevis;
 ExitProcess(makevis());
}
Vorgefundene Kodierung: UTF-80