Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > CreateProcess


Автор: RideX 27.9.2004, 05:28
Нужно запустить стороннюю программу с помощью CreateProcess, задав с помощью параметров STARTUPINFO положение и размер окна, но что-то не выходит. Что здесь не так? Вот код:
Код

procedure TForm1.Button1Click(Sender: TObject);
var
 si: TStartupInfo;
 p:  TprocessInformation;
begin
FillChar(si, SizeOf(si), 0);
with si do begin
 cb := SizeOf(si);
 dwX := 0;
 dwY := 0;
 dwXSize := 100;
 dwYSize := 50;
 dwFlags := STARTF_USESHOWWINDOW + STARTF_USESIZE + STARTF_USEPOSITION;
 wShowWindow := SW_SHOWNOACTIVATE;
end;

Application.Minimize;
CreateProcess(nil,'notepad.exe', nil, nil, False, CREATE_DEFAULT_ERROR_MODE, nil, nil, si, p);
Waitforsingleobject(p.hProcess, INFINITE);
Application.Restore;
end;

Автор: bear 27.9.2004, 06:32
Попробуй лучше WinExexc и SetWindowPos.

Автор: RideX 27.9.2004, 08:02
bear
WinExec устаревшая ф-ция, оставленная только для совместимости, в Win32 нужно использовать CreateProcess. В дополнение к сказанному тобой, эту задачу также можно решить и через ShellExecute, MoveWindow, ShellExecuteEx, но надо разобраться, как это сделать с помощью CreateProcess. Кто-нибудь может что-то подсказать?

Автор: DonPager 27.9.2004, 12:29
RideX
вот тебе функция которая обернёт CreateProcess в удобную форму
Код

function ExecIt(const FileName,Params: ShortString;const WinState: Word): boolean; export;
var
 StartInfo: TStartupInfo;
 ProcInfo: TProcessInformation;
 CmdLine: ShortString;
begin
 CmdLine := '"' + Filename + '" ' + Params;
 FillChar(StartInfo, SizeOf(StartInfo), #0);
 with StartInfo do
  begin
   cb := SizeOf(StartInfo);
   dwFlags := STARTF_USESHOWWINDOW;
   wShowWindow := WinState;
  end;
 Result := CreateProcess(nil, PChar( String( CmdLine ) ), nil, nil, false,
                         CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil,
                         PChar(ExtractFilePath(Filename)),StartInfo,ProcInfo);
end;

Автор: RideX 27.9.2004, 12:49
DonPager
Спасибо за совет smile.gif Дело в том, что в StartupInfo есть такие параметры как dwX: DWORD; dwY: DWORD; dwXSize: DWORD; dwYSize: DWORD; они служат для задания параметров положения и размера окна запускаемого приложения, именно их я и хочу задействовать, но почему-то не получается sad.gif В твоём примере этого сделать нельзя, а wShowWindow у меня работает нормально... Тем не менее, ещё раз спасибо.

Автор: DonPager 27.9.2004, 12:56
RideX ...точно не скажу но просто попробуй использовать прямой вызов запуска процесса из MSDN(но помни там передаются указатели а не переменные)
там примерно 5 похожих процедур с разными дополнительными фичами

З.Ы. и в твоём случае попробуй задавать поле cb в конце определения;

Автор: RideX 27.9.2004, 13:10
Цитата(DonPager @ 27.9.2004, 12:56)
попробуй задавать поле cb в конце определения

Попробовал, не то...

Автор: p0s0l 27.9.2004, 20:57
В MSDN сказано про эти параметры:
Цитата
dwX
If dwFlags specifies STARTF_USEPOSITION, this member is the x offset of the upper left corner of a window if a new window is created, in pixels. Otherwise, this member is ignored.
The offset is from the upper left corner of the screen. For GUI processes, the specified position is used the first time the new process calls CreateWindow to create an overlapped window if the x parameter of CreateWindow is CW_USEDEFAULT.
(главное - выделено, а еще главнее - подчёркнуто)
Про dwY, dwXSize, dwYSize - то же самое...

Автор: p0s0l 27.9.2004, 21:47
Мой совет - ждать появления первого окна, и менять у него параметры

Автор: RideX 28.9.2004, 08:59
p0s0l
Всё понятно, спасибо biggrin.gif

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)