2014-01-15 107 views
0

我的程序(C#)是一個任務欄,並且在其菜單中我可以啓動應用程序,兼容XP到8.1。我想用特定的窗口大小啓動任何應用程序,因爲很少有應用程序(OpenOffice,LibreOffice ...)在第一次啓動時就開始變平。以編程方式將特定大小設置爲應用程序窗口

我已經測試,以最大限度地利用這一窗口ShellExecuteShowCommands.SW_MAXIMIZE參數:

ShellExecute(IntPtr.Zero, "open", executablePath, executableParam, "", ShowCommands.SW_MAXIMIZE); 

但是當我點擊該窗口中的「恢復」按鈕,出現同樣的問題,窗口被夷爲平地。

儘管「還原」大小未通過手動調整大小進行配置,但所用值是特定於每個應用程序的。

相反的ShellExecute,我用CreateProcess指定大小:

const uint NORMAL_PRIORITY_CLASS = 0x0020; 
STARTUPINFO si = new STARTUPINFO(); 
si.dwY = 50; 
si.dwX = 50; 
si.dwXSize = 200; 
si.dwYSize = 800; 
si.dwFlags = 0x00000006; //STARTF_USESIZE + STARTF_USEPOSITION 
PROCESS_INFORMATION pi = new PROCESS_INFORMATION(); 

CreateProcess(programPath, programParams, IntPtr.Zero, IntPtr.Zero, true, NORMAL_PRIORITY_CLASS, IntPtr.Zero, null, ref si, out pi); 

但是有一個問題,我們可以啓動與文件 - >新建一個其他的OpenOffice/LibreOffice的過程 - > ...在這種如果應用程序不是由我的程序啓動的,所以我的默認大小不適用。

我以前和更改此值後,檢查Windows註冊表中,兩個鍵被改變:

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\ComDlg32\OpenSavePidlMRU\reg] 
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\Count] 

這些鍵包含六值(第一密鑰):

前:

"MRUListEx"=hex:00,00,00,00,04,00,00,00,01,00,00,00,05,00,00,00,03,00,00,00,02,\00,00,00,ff,ff,ff,ff 

之後:

"MRUListEx"=hex:01,00,00,00,00,00,00,00,04,00,00,00,05,00,00,00,03,00,00,00,02,\00,00,00,ff,ff,ff,ff 

這對我來說是不可理解的,所以我仍然在搜索是否存在一種編程方式,以將程序的特定窗口大小/所有應用程序或其他規範設置到Windows註冊表中。我不是在尋找解決方案來調整或移動已啓動的窗口,如SetWindowPos

但很多網站解釋這裏只有一個解決方案來定義窗口的大小:「在拖動窗口的大小,然後關閉窗口,並重新啓動」

http://help.wfu.edu/public/computers/standard-load-software/windows-7---set-default-window-size http://www.tomshardware.co.uk/forum/28659-45-change-default-window-size

這個答案是最後解決方案還是有一種方法來編程?

在此先感謝。

編輯:

事實上,在恢復窗口時,我調整僅在第一次直到用戶殺死它。 我的程序將每個窗口的句柄保存在一個布爾值初始化爲false的對象中,以指定我的窗口是否已被調整大小。我使用GetForegroundWindow然後GetWindowPlacement我檢查是否WINDOWPLACEMENT .flags == WindowPlacementFlag.WPF_NONE,如果我的布爾值總是egals爲false,那麼我使用GetWindowRect和SetWindowPos設置具有相同位置的特定大小並將我的布爾值賦給true。

我認爲這是一個很好的解決方案,但我失去用戶保存的位置(我可以做到這一點時,窗口的大小是根據一個特定的值,但仍存在問題),我們看到的大小調整...

+1

每個應用程序都以自己的方式決定如何定位其窗口。重申申請的決定沒有標準。 –

+0

這就是我害怕的。感謝您的回答。 – OhMyGeo

回答

0

通常會出現此問題,因爲編碼器使用GetWindowPos來獲取保存位置,但窗口在最小化時關閉,因此位置是任務欄隱藏的一個小窗口。這就是保存的位置。正確的方法是使用GetWindowPlacement來保存位置。

您可以枚舉所有頂級窗口,檢查GetWindowPlacement以查看哪些可見並可以恢復,但是大小或位置不合適(例如,屏幕外,太小)。然後您可以撥打SetWindowPlacement將這些窗口移回到屏幕上合理的最小尺寸。

很有可能當他們再次保存自己的位置時,他們將拯救新的職位。

不要輪詢。相反,使它成爲用戶可以在需要時運行的實用程序。 (您可能也需要一個例外列表 - 某些實用程序可能會故意創建一個屏幕外的窗口。)

+0

感謝您的回答。我編輯了我的帖子。我使用這些方法幾乎完美的解決方案。很遺憾,某處沒有默認值。 – OhMyGeo

相關問題