void WindowManager::resize(unsigned clientW, unsigned clientH) { HWND hwnd = ::GetActiveWindow(); // Store current window rect ::GetClientRect(hwnd, &prevWindowRect); // Get monitor size HMONITOR monitor = MonitorFromWindow(hwnd, MONITOR_DEFAULTTONEAREST); MONITORINFO info; info.cbSize = sizeof(MONITORINFO); GetMonitorInfo(monitor, &info); int monitorWidth = info.rcMonitor.right - info.rcMonitor.left; int monitorHeight = info.rcMonitor.bottom - info.rcMonitor.top; // How much do we overlap or are smaller than the actual screen size int widthDiff = monitorWidth - (clientW ? clientW : prevWindowRect.right); int heightDiff = monitorHeight - (clientH ? clientH : prevWindowRect.bottom); RECT desiredRect; desiredRect.left = widthDiff / 2; desiredRect.top = heightDiff / 2; desiredRect.right = monitorWidth - (widthDiff / 2); desiredRect.bottom = monitorHeight - (heightDiff / 2); LONG lStyle = ::GetWindowLong(hwnd, GWL_STYLE); TrueAdjustWindowRect(&desiredRect, lStyle, false); TrueSetWindowPos(hwnd, NULL, desiredRect.left, desiredRect.top, desiredRect.right-desiredRect.left, desiredRect.bottom-desiredRect.top, SWP_NOZORDER); SDLOG(0, "Set Window rect to %s\n", RectToString(&desiredRect).c_str()); }
GENERATE_INTERCEPT_HEADER(SetWindowPos, BOOL, WINAPI, _In_ HWND hWnd, _In_opt_ HWND hWndInsertAfter, _In_ int X, _In_ int Y, _In_ int cx, _In_ int cy, _In_ UINT uFlags) { if(cx > static_cast<int>(Settings::get().getPresentWidth())) cx = Settings::get().getPresentWidth(); if(cy > static_cast<int>(Settings::get().getPresentHeight())) cy = Settings::get().getPresentHeight(); return TrueSetWindowPos(hWnd, hWndInsertAfter, X, Y, cx, cy, uFlags); }
GENERATE_INTERCEPT_HEADER(SetWindowPos, BOOL, WINAPI, _In_ HWND hWnd, _In_opt_ HWND hWndInsertAfter, _In_ int X, _In_ int Y, _In_ int cx, _In_ int cy, _In_ UINT uFlags) { return TrueSetWindowPos(hWnd, hWndInsertAfter, X, Y, cx, cy, uFlags); }