窗口最大化最大化

时间:2011-09-02 09:31:51

标签: c++ windows winapi hook dll-injection

我希望创建一个程序,我可以设置最大最大尺寸(如同按下最大化按钮时窗口最大化的大小)和最大化所有位置(最大化窗口的X / Y协调)正在运行的窗口。这样我可以在我的辅助显示器上随时看到我的Rainmeter,而无需手动调整其内部的每个窗口。

我已经设法为我使用WinAPI中的MINMAXSIZE编写的简单程序执行此操作。这种方法似乎对我的小程序非常有效,但除了互联网上的1或2篇文章之外,它的文档很少。我想知道这是否是设置最大最大化大小的最佳方式,或者是否有其他方法可以做到这一点。

我计划在所有应用程序中实现这一点的方式是DLL注入或Hooks(我都没有任何经验),所以我也想知道你们这些方法的想法。

我知道有一些应用程序已经做到这一点,但我认为这可能是一种学习经验,而且我尝试的所有应用程序都不能很好地工作(尽管可能是这种情况)所有这些都归功于Windows的运行方式。)

如果你们中任何一个人仍然不确定我在说什么,MaxMax完全符合我的要求(尽管它的效果不是很好,正如我在前一段中所述)。

提前谢谢大家。

2 个答案:

答案 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注入执行此操作,并使用EnumWindowsEnumChildWindowSetWindowLongPtr / SetWindowSubclass有效地为每个窗口创建子类。但是,为什么只要使用SetWindowsHookEx就可以解决所有麻烦? :)

要更改x / y,您可能需要为WM_SYSCOMMAND添加覆盖并检查SC_MAXIMIZE,然后使用SetWindowPos / MoveWindow正确定位(如果不是想要它在默认的0,0)。