Fórum como saber se um programa fechou? #319491

19/04/2006

0

eu chamo um programa através do WinExec.

e gostaria de saber quando a pessoa no caso o usuário terminou de usá-lo tem como saber isso?

agradecendo desde já


Piaum3

Piaum3

Responder

Posts

19/04/2006

Rafael Gomes

apos chamar o programa pelo winexec vc pode verificar se o programa esta aberto localizando a janela atraves do comando

FindWindow

essa funcao retorna o Handle da janela se ela existir ...
caso ela nao exista a funcao retorna NULL ...

vc poderia fazer algo assim ...

function VerificaJanela(classe: string): boolean;
var
 H: THandle;
begin
   result:= false;
   H:= FindWindow(PAnsiChar(classe), nil);
   if H <> 0 then result:= true;
end;


existe uma outra maneira ... mais complexa ... se voce quiser que o seu programa só obtenha o controle depois que o aplicativo chamado pelo WinExec for encerrado utilize essa funcao ...

function ExecAndWait(const FileName, Params: ShortString; const WinState: Word): boolean; export; // executa um programa externo e espera ate o mesmo ser encerrado para devolver o controle ao programa
  var
    StartInfo: TStartupInfo;
    ProcInfo: TProcessInformation;
    CmdLine: ShortString;
begin
  { Coloca o nome do arquivo entre aspas, devido a possibilidade de existir espaços nos nomes longos do Windows 9x }
  CmdLine := ´"´ + FileName + ´" ´ + Params;
  FillChar(StartInfo, SizeOf(StartInfo), #0);
  with StartInfo do
    begin
      //cb := SizeOf(SUInfo); //erro aqui
      cb := SizeOf(StartInfo); //essa linha está correta
      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);
    { Aguarda o encerramento do programa executado }
    if Result then
      begin
        WaitForSingleObject(ProcInfo.hProcess, INFINITE);
        { Libera os Handles utilizados }
        CloseHandle(ProcInfo.hProcess);
        CloseHandle(ProcInfo.hThread);
      end;
end;


a funcao executa um aplicativo e espera ate ela ser terminada pra devolver o controle para sua aplicacao ....

espero ter ajudado ...

[..]s


Responder

Gostei + 0

19/04/2006

Piaum3

pô cara ajudou bastante..

mais qual seria a linha de comando para executar essa função?

agradecendo desde já


Responder

Gostei + 0

19/04/2006

Rafael Gomes

para executar as duas funcoes chame assim

if VerificaJanela(´notepad´) then
  showmessage(´Notepad aberto´);

ExecAndWait(path + ´\MDAC\MDAC_TYP.exe´,´/Q:A /C:"dasetup /Q:D /N"´,SW_HIDE)


a funcao VerificaJanela voce pode adaptar para localizar a janela pelo titulo da janela ...

dessa forma a funcao ficaria assim ...

function VerificaJanela(titulo: string): boolean; 
var 
 H: THandle; 
begin 
   result:= false; 
   H:= FindWindow(nil, PAnsiChar(titulo)); 
   if H <> 0 then result:= true; 
end;


ExecAndWait(caminho do executavel, parametros se existirem, modo como a janela sera exeibida)


Responder

Gostei + 0

12/04/2007

Raserafim

rafael, tentei usar a sua sugestão ExecAndWait mas não consegui.

não tem erro de sintaxe pois a compilação tem sucesso, mas o programa que mando executar não abre.

vc poderia explicar um pouco mais detalhado e dar um exemplo?


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar