1

我正在寻找一个程序,我可以在其中设置所有窗口的最大最大化大小(如当您点击最大化按钮时窗口最大化的大小)和最大化位置(X/Y 与最大化窗口协调)正在跑步。这样我就可以让我的 Rainmeter 在我的辅助显示器上始终可见,而无需手动调整每个窗口的大小以适合其中。

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

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

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

如果你们中的任何人仍然不确定我在说什么,MaxMax完全符合我的要求(尽管它效果不佳,正如我在上一段中所说的那样)。

谢谢大家。

4

2 回答 2

2

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

于 2011-09-02T09:57:20.710 回答
1

您想要做的是使用全局窗口挂钩来处理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 注入来执行此操作,并使用EnumWindowsEnumChildWindowSetWindowLongPtr / SetWindowSubclass有效地对每个窗口进行子类化有效地对每个窗口进行子类化。但是,当您可以只使用 SetWindowsHookEx 时,为什么还要麻烦呢?:)

要更改 x/y,您可能必须为WM_SYSCOMMAND添加覆盖并检查 SC_MAXIMIZE,然后使用SetWindowPos / MoveWindow正确定位它(如果您不希望它位于默认的 0、0 上)。

于 2011-09-02T09:51:32.680 回答