调整使用 createprocess 创建的应用程序的大小和位置?
Posted
技术标签:
【中文标题】调整使用 createprocess 创建的应用程序的大小和位置?【英文标题】:Resize and reposition the application created using createprocess? 【发布时间】:2011-12-12 10:19:08 【问题描述】:我正在使用 createprocess 执行应用程序,比如记事本。
我需要覆盖该应用程序的默认大小和位置,因此我修改了 STARTUPINFO,并指定了 dwX、dwY、dwYSize、dwXSize 并将 STARTF_USEPOSITION||STARTF_USESIZE 添加到 dwFlags。
但应用程序根本没有打开。 如果我放置 STARTF_USEPOSITION 和 STARTF_USESIZE 之一,应用程序会打开但不会重新定位或调整大小。
有什么办法吗?
STARTUPINFO siStartupInfo;
PROCESS_INFORMATION piProcessInfo;
memset(&siStartupInfo, 0, sizeof(siStartupInfo));
memset(&piProcessInfo, 0, sizeof(piProcessInfo));
siStartupInfo.cb = sizeof(siStartupInfo);
siStartupInfo.dwFlags = STARTF_USEPOSITION|STARTF_USESIZE;//||STARTF_USESHOWWINDOW;
siStartupInfo.wShowWindow=SW_SHOWDEFAULT;
siStartupInfo.dwX=900;
siStartupInfo.dwY=300;
siStartupInfo.dwXSize=1000;
siStartupInfo.dwYSize=1000;
if(CreateProcess("H:\\WINXP\\system32\\notepad.exe", // Application name
NULL , // Application arguments
0,
0,
FALSE,
NORMAL_PRIORITY_CLASS,
0,
0, // Working directory
&siStartupInfo,
&piProcessInfo) )
printf("Sucessful\n");
else
printf("Error");
【问题讨论】:
您确定您的“STARTF_USEPOSITION||STARTF_USESIZE”有两个条吗?应该是一根吧。除此之外,您可能还需要向我们展示您使用的代码。 我的错,我换了运营商。它现在打开,但窗口大小和位置仍然保持不变。 【参考方案1】:应用程序可能会忽略STARTUPINFO
中的所有数据,或仅使用wShowWindow
。
您可以尝试使用WaitForInputIdle
,然后是FindWindow
,然后是SetWindowPos
。
【讨论】:
我已经完成了 SetWindowPos ,但它也没有相应地重新绘制记事本,记事本以其默认位置和大小打开,但在指定位置创建了一个小框架。我不确定我应该使用什么 uFlags。 SetWindowPos 失败,返回 0。 @HariHaraSudhan,它也返回错误,检查GetLastError
。
,它的 1400,应该是无效的窗口句柄错误。如果可能的话,您能否提供我编写的程序的剩余代码,包括WaitForInputIdle、FindWindow 和SetWindowPos。
@HariHaraSudhan,不,这是不可能的。【参考方案2】:
似乎记事本没有使用GetStartupInfo()
来读取创建时传入的STARTUPINFO
。我过去为解决这个问题所做的事情是将有效的PROCESS_INFORMATION
传递给CreateProcess
。
由此,您将能够得到创建进程的PID。然后您可以使用EnumWindows
和GetWindowThreadProcessId
进行轮询,直到找到窗口。这比 FindWindow
更准确,后者可能会匹配记事本的其他实例。
【讨论】:
以上是关于调整使用 createprocess 创建的应用程序的大小和位置?的主要内容,如果未能解决你的问题,请参考以下文章
CreateProcess 返回非 0 但 GetExitCodeProcess() 返回 128