Приложение. Восстановление не доставляет меня туда, где я был раньше, почему? - PullRequest
2 голосов
/ 29 января 2010

Приложение, которое я сейчас пытаюсь поддерживать ( мое прежнее создание ), является полным беспорядком, и поэтому я запрограммировал расширение для него как отдельный исполняемый файл, который затем запускаю, вызываю application.minimize; и WaitForSingleObject (недавно созданный процесс). Сразу после этого я звоню application.restore, чтобы вернуть меня туда, где я остановился.

application.Minimize;
WaitForSingleObject(ProcInfo.hProcess, INFINITE);
Application.Restore;
Application.BringToFront;
BringToFront; //the topmost form which was used to launch the app
Show;

Затем я вижу (Win XP), как это описать ?, рамка приложения выпрыгивает из панели задач и делает так, как будто приложение восстанавливает себя на экране, но это не так на самом деле показать. Как вы можете видеть, я довольно отчаянный и комбинированный app.restore, app.bringtofront, form.bringtofront, form.show ... но я думаю, что мне нужно какое-то приложение.show, активировать, фокусировать ... не могу кажется, найти их.

Кроме того, почему этого недостаточно?

application.Minimize;
WaitForSingleObject(ProcInfo.hProcess, INFINITE);
Application.Restore;

EDIT

Основная форма - wsMaximized, она вызывает anotherform.showmodal;, которая затем в конечном итоге пытается свернуть приложение, запустить другой процесс и восстановить приложение. Я думаю, дело в модальности самой верхней формы.

пример кода для другой (самой верхней) формы, которая отображается как модальная:

function ExecAndWait(const FileName, Params: string;
  WindowState: Word): Boolean;
var
  SUInfo: TStartupInfo;
  ProcInfo: TProcessInformation;
  CmdLine: string;
begin
  { Enclose filename in quotes to take care of
    long filenames with spaces. }
  CmdLine := '"' + FileName + '" ' + Params;
  FillChar(SUInfo, SizeOf(SUInfo), #0);
  with SUInfo do
  begin
    cb := SizeOf(SUInfo);
    dwFlags := STARTF_USESHOWWINDOW;
    wShowWindow := WindowState;
  end;
  Result := CreateProcess(nil, PChar(CmdLine), nil, nil, False,
    CREATE_NEW_CONSOLE or
    NORMAL_PRIORITY_CLASS, nil,
    PChar(ExtractFilePath(FileName)),
    SUInfo, ProcInfo);
  { Wait for it to finish. }
  if Result then
  begin
    application.Minimize;
    WaitForSingleObject(ProcInfo.hProcess, INFINITE);
    Application.Restore;
    Application.BringToFront;
  end;
end;

procedure TForm2.Button1Click(Sender: TObject);
begin
  ExecAndWait('C:\Windows\system32\mspaint.exe' , '' , SW_NORMAL);
end;

1 Ответ

6 голосов
/ 29 января 2010

ShowModal вызывает отключение всех форм приложения, кроме модальной формы. Вы не можете свернуть, восстановить отключенное окно по желанию. Попробуйте что-нибудь как;

  if Result then
  begin
    EnableWindow(Application.MainForm.Handle, True);
    application.Minimize;
    WaitForSingleObject(ProcInfo.hProcess, INFINITE);
    Application.Restore;
    EnableWindow(Application.MainForm.Handle, False);
    Application.BringToFront;
  end;
...