// 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-8 | 0
|