以编程方式将特定大小设置为应用程序窗口

时间:2014-01-15 11:13:48

标签: c# windows registry window-resize

我的程序(C#)是一个任务栏,在其菜单中我可以启动应用程序,兼容XP到8.1。我想启动具有特定窗口大小的任何应用程序,因为当我第一次启动时,很少有应用程序(OpenOffice,LibreOffice ......)开始变平。

我已使用ShellExecute ShowCommands.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);

但是有一个问题,我们可以使用File-> New->启动其他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]

这些键包含hexa值(第一个键):

之前:

"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 :(得分:0)

这个问题通常会发生,因为编码器使用GetWindowPos来获取保存位置,但窗口在最小化时关闭,因此位置是任务栏隐藏的一个小窗口。这就是保存的位置。正确的方法是使用GetWindowPlacement来保存位置。

您可以枚举所有顶级窗口,检查GetWindowPlacement以查看哪些是可见的和已恢复但尺寸或位置不合适(例如,屏幕外,太小)。然后你可以调用SetWindowPlacement将这些窗口移回到屏幕上合理的最小尺寸。

当他们再次保存自己的位置时,他们很可能会保留新职位。

不要轮询。而是使其成为用户可以在需要时运行的实用程序。 (您可能也需要一个例外列表 - 某些实用程序可能会故意创建一个屏幕外窗口。)