procedure TForm1.Button1Click(Sender: TObject);
var
  StartupInfo: TStartupInfo;
  ProcessInfo: TProcessInformation;
begin
  FillChar(StartupInfo, Sizeof(StartupInfo), 0);
  StartupInfo.cb := Sizeof(StartupInfo);
  StartupInfo.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESIZE or STARTF_USEPOSITION;
  StartupInfo.wShowWindow := SW_SHOW;
  //----------以下设置不起作用------------
  Startupinfo.dwX := 0;
  Startupinfo.dwY := 0;
  Startupinfo.dwXSize := 800;
  Startupinfo.dwYSize := 600;
  //--------------------------------------
  CreateProcess('c:\windows\notepad.exe',nil,nil,nil,FALSE,CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS,nil,nil,StartupInfo,ProcessInfo);
end;如题。请高手帮忙解答,3Q

解决方案 »

  1.   

    help中关于dwXSize, dwYSize的描述还有一句话
     this is used only the first time the new process calls CreateWindow to create an overlapped window if the nWidth parameter of CreateWindow is CW_USEDEFAULT. 
    所以我加了句
    WaitForInputIdle(ProcessInfo.hProcess, INFINITE);
    MoveWindow(GetForegroundWindow(), 0, 0, 800, 600, True);
    可能是好使,呵
      

  2.   

    支持楼上,实在不行的话,就调用MoveWindow调整窗口大小吧
      

  3.   

    if WaitForInputIdle(ProcessInfo.hProcess, INFINITE) = 0 then
    begin
      WindowHwnd := GetWindowHwnd(ProcessInfo.dwProcessId); //自定义函数,通过进程ID获取主窗体句柄。
      Sleep(1000); //这里必须要暂停一段时间。否则不能移动窗体。请问这个值设多少才合适,太少有时又不能移动。迷惑中
      MoveWindow(WindowHwnd, 0, 0, 800, 600, True);
    end;
      

  4.   

    我也碰到这个问题,不过对于像notepad.exe这种小或者说该进程所创建的窗体比较少时,是不必sleep()的,不过像远程桌面连接的,就必须sleep(2000)或者以上了,不知道能否通过其它方式获得sleep()的时间,毕竟每个应用程序sleep()的时候不一致。