我希望创建一个程序,我可以设置最大最大尺寸(如同按下最大化按钮时窗口最大化的大小)和最大化所有位置(最大化窗口的X / Y协调)正在运行的窗口。这样我可以在我的辅助显示器上随时看到我的Rainmeter,而无需手动调整其内部的每个窗口。
我已经设法为我使用WinAPI中的MINMAXSIZE编写的简单程序执行此操作。这种方法似乎对我的小程序非常有效,但除了互联网上的1或2篇文章之外,它的文档很少。我想知道这是否是设置最大最大化大小的最佳方式,或者是否有其他方法可以做到这一点。
我计划在所有应用程序中实现这一点的方式是DLL注入或Hooks(我都没有任何经验),所以我也想知道你们这些方法的想法。
我知道有一些应用程序已经做到这一点,但我认为这可能是一种学习经验,而且我尝试的所有应用程序都不能很好地工作(尽管可能是这种情况)所有这些都归功于Windows的运行方式。)
如果你们中任何一个人仍然不确定我在说什么,MaxMax完全符合我的要求(尽管它的效果不是很好,正如我在前一段中所述)。
提前谢谢大家。
答案 0 :(得分:2)
您可能正在寻找的是工作区设置,您可以使用SystemParametersInfo
函数设置/检索,使用标记SPI_SETWORKAREA
/ {{调用1}}。
答案 1 :(得分:1)
您要做的是使用全局Windows挂钩来处理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;
}
这将允许在这种情况下将默认值分配给您不关心的尺寸(min 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)。