То, что вы хотите сделать, это использовать глобальный хук окон для обработки WM_GETMINMAXINFO . Как вы, возможно, знаете, это сообщение:
Отправляется в окно, когда размер или положение окна
менять. Приложение может использовать это сообщение для переопределения окна
максимальный размер и положение по умолчанию или минимальное или максимальное значение по умолчанию
размер отслеживания.
Лучший способ использовать это для переопределения максимального значения по умолчанию - заполнить структуру MINMAXINFO следующим образом:
case WM_GETMINMAXINFO: {
DefWindowProc(hWnd, message, wParam, lParam);
MINMAXINFO* mmi = (MINMAXINFO*)lParam;
mmi->ptMaxTrackSize.x = 100;
mmi->ptMaxTrackSize.y = 100;
return 0;
}
Это позволит присваивать значения по умолчанию размерам, которые вас не интересуют (мин. Х / г) в этом случае, оставляя вам возможность выбирать максимальные значения по своему усмотрению. Ваш хук Windows должен быть сделан с помощью SetWindowsHookEx () и должен выглядеть примерно так:
SetWindowsHookEx(WH_CALLWNDPROC, hook_procedure, instance_handle, 0);
hMod (instance_handle) должен быть установлен только в зависимости от обстоятельств (проверьте документы для этого). DwThreadId требует глобального хука. Ваш CallWndProc может выглядеть примерно так:
__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);
}
К сожалению, вам придется иметь дело с тем, что единственные окна, которые будут подключены, это те, которые существовали, когда вы обращались к SetWindowsHookEx (). Мне не известен чистый способ обойти это, если не считать зацикливание вызова SetWindowsHookEx () (эх!).
Вы можете сделать это с помощью внедрения DLL и эффективно создать подклассы для каждого окна с EnumWindows , EnumChildWindow и SetWindowLongPtr / SetWindowSubclass . Но зачем идти на все эти неприятности, когда вы можете просто использовать SetWindowsHookEx? :)
Чтобы изменить x / y, вам может потребоваться добавить переопределение для WM_SYSCOMMAND и проверить SC_MAXIMIZE, а затем использовать SetWindowPos / MoveWindow , чтобы правильно расположить его (если вы не хотите его по умолчанию 0, 0).