2011-09-02 276 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檢索。