您想要做的是使用全局窗口挂钩来处理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;
}
在这种情况下,这将允许将默认值分配给您不关心的尺寸(最小 x/y),让您随意摆弄最大值。你的 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 上)。