调整大小并重新定位使用createprocess创建的应用程序?

时间:2011-12-12 10:19:08

标签: c winapi resize override createprocess

我正在使用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");
}

2 个答案:

答案 0 :(得分:3)

应用可能会忽略STARTUPINFO中的所有数据,或仅使用wShowWindow

您可以尝试使用WaitForInputIdle,然后使用FindWindow,然后SetWindowPos

答案 1 :(得分:0)

似乎记事本没有使用GetStartupInfo()来读取创建时传入的STARTUPINFO。我过去做过的事情就是将有效PROCESS_INFORMATION传递给CreateProcess

由此,您将能够获得创建的进程'PID。然后,您可以使用EnumWindowsGetWindowThreadProcessId进行投票,直至找到该窗口。这比FindWindow更准确,{{1}}可能与其他记事本实例匹配。