你想要做的是使用全局窗口鉤子來處理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呢? –