L'application que j'essaye maintenant de soutenir (a former creation of mine) est un désordre complet, et ainsi j'ai programmé une extension à lui comme un exécutable séparé que je lance alors, appelez application.minimize;
et WaitForSingleObject
(le processus récemment créé). Juste après, j'appelle le application.restore
pour me ramener à l'endroit où je m'étais arrêté.Application.Restore ne me permet pas d'où j'étais auparavant, pourquoi?
application.Minimize;
WaitForSingleObject(ProcInfo.hProcess, INFINITE);
Application.Restore;
Application.BringToFront;
BringToFront; //the topmost form which was used to launch the app
Show;
Je peux alors voir (Win XP), comment le décrire ?, le cadre de l'application sauter de la barre des tâches et faire comme si l'application a été lui-même de restaurer à l'écran, mais il ne fonctionne pas montrer réellement. Comme vous pouvez le voir, je suis assez désespéré et combiné app.restore, app.bringtofront, form.bringtofront, form.show ... mais je pense que j'ai besoin d'une sorte d'application.show, activate, focus ... ne peut pas semble trouver ceux-ci.
Aussi, pourquoi est-ce pas assez?
application.Minimize;
WaitForSingleObject(ProcInfo.hProcess, INFINITE);
Application.Restore;
EDIT
La principale forme est wsMaximized
, cela appelle anotherform.showmodal;
qui tente alors de minimiser éventuellement l'application, lancez l'autre processus, et restaurer l'application. Je pense que l'astuce est avec la MODALité de la forme la plus haute.
exemple de code pour l'autre forme (le plus haut), qui est représenté comme modal:
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;
Juste minimiser suivi par la restauration fonctionne pour moi. Avez-vous essayé Application.ProcessMessages? –
oui. n'a pas aidé. –
Et vous n'avez aucun moyen de déboguer? –