调整使用 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。然后您可以使用EnumWindowsGetWindowThreadProcessId 进行轮询,直到找到窗口。这比 FindWindow 更准确,后者可能会匹配记事本的其他实例。

【讨论】:

以上是关于调整使用 createprocess 创建的应用程序的大小和位置?的主要内容,如果未能解决你的问题,请参考以下文章

CreateProcess 返回非 0 但 GetExitCodeProcess() 返回 128

CreateProcess 不在主线程中

将命令行进程的标准输出重定向到文件

将输入传递给由 CreateProcess() 创建的进程

windows 下在进程中使用createprocess创建一个窗口进程,并获取这个窗口HWND句柄

CreateProcess() 启动子应用程序