你想要做的是使用全局窗口钩子来处理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()(ergh!)的循环之后的干净方式。
你可能用DLL注入做到这一点,并有效地继承每个窗口EnumWindows,EnumChildWindow和SetWindowLongPtr/SetWindowSubclass。但是,为什么要在使用SetWindowsHookEx时遇到所有这些麻烦? :)
要改变X/Y,您可能需要添加替代为WM_SYSCOMMAND和检查SC_MAXIMIZE然后使用SetWindowPos/MoveWindow正确定位它(如果你不希望它在默认为0,0) 。
呃。为什么不修复Rainmeter呢? –