2011-09-02 238 views
0

我正在创建一个程序,可以设置最大化最大化大小(如窗口最大化时的大小,以便当您点击最大化按钮时)和最大化位置(最大化窗口的X/Y坐标)为所有正在运行的窗口。这样我就可以随时在我的辅助显示器上看到我的Rainmeter,而无需手动调整每个窗口的尺寸。窗口最大化最大化

我已经设法做到这一点,我用WinAPI编写的MINMAXSIZE编写了一个简单的程序。这种方法似乎对我的小程序来说是完美的,但在互联网上的1或2篇文章旁边几乎没有文档。我想知道这是否是设置最大最大尺寸的最佳方式,或者是否有另一种方法可以实现此目的。

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

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

如果你们中的任何一个人仍然不确定我在说什么,MaxMax确实是我想要的(尽管它效果不佳,正如我在前一段中所述)。

谢谢大家提前。

+1

呃。为什么不修复Rainmeter呢? –

回答

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()(ergh!)的循环之后的干净方式。

你可能用DLL注入做到这一点,并有效地继承每个窗口EnumWindowsEnumChildWindowSetWindowLongPtr/SetWindowSubclass。但是,为什么要在使用SetWindowsHookEx时遇到所有这些麻烦? :)

要改变X/Y,您可能需要添加替代为WM_SYSCOMMAND和检查SC_MAXIMIZE然后使用SetWindowPos/MoveWindow正确定位它(如果你不希望它在默认为0,0) 。

1

什么,你可能找的是工作区设置,您可以设置/与SystemParametersInfo函数,调用标志SPI_SETWORKAREA/SPI_GETWORKAREA检索。