窗口最大值最大化



我希望创建一个程序,在那里我可以设置最大的最大尺寸(如在窗口最大化的大小,当你点击最大化按钮)和最大化位置(X/Y协调最大化窗口)为所有正在运行的窗口。这样我就可以让我的雨量计在我的二级显示器上随时可见,而不必手动调整每个窗口的大小。

我已经设法为我使用WinAPI的MINMAXSIZE编写的一个简单程序做到了这一点。这种方法似乎对我的小程序非常有效,但在互联网上除了1或2篇文章之外,很少有关于它的文档。我想知道如果这将是最好的方式来设置最大最大化的大小,或者如果有另一种方法来做到这一点。

他们的方式我计划实现这到所有的应用程序将是DLL注入或钩子(这两个我都没有任何经验),所以我也想知道你的家伙对这些方法的想法。

我知道有一些应用程序已经做到了这一点,但我认为这可能是一个学习经验,而且,我尝试的所有应用程序都不是很好(尽管由于Windows的功能方式,所有应用程序都可能是这样)。

如果你们中的任何人仍然不确定我在说什么,MaxMax正是我想要的(尽管它不太好用,正如我在上一段中所说的)。

提前感谢大家。

您可能正在寻找的是工作区域设置,您可以使用SystemParametersInfo函数设置/检索,使用标志SPI_SETWORKAREA/SPI_GETWORKAREA调用。

你要做的是使用全局窗口钩子来处理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上)。

最新更新