2014-01-15 74 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

相关问题