como verificar se um aplicativo esta rodando?

Delphi

11/08/2008

boa noite,

Preciso saber se um aplicativo esta rodando para poder fazer uma ação como faço isso...Ex. tenho um função que copia um arq. exe de um lugar para outro, mas se o executavel estiver rodando da pau, portanto preciso verificar se este excutavel esta rodando na origem.
t+


Xprata

Xprata

Curtidas 0

Respostas

Paullsoftware

Paullsoftware

11/08/2008

bem, para localizar uma janela pelo título você pode usar o comando FindWindow e para finalizar esse aplicativo você pode usar o comando SendMessage passados os parametros solicitando o fechamento do mesmo:::

procedure TForm1.Button1Click(Sender: TObject);
var
Aberto:HWND;
begin
Aberto := FindWindow(nil,´Calculadora´);
if Aberto <> 0 then
SendMessage(Aberto,WM_CLOSE,0,0);
end;

No exemplo eu fecho a Calculadora do Windows, mais pode ser qualquer títlulo, espero ter ajudado! :wink:


GOSTEI 0
.lg.

.lg.

11/08/2008

bem, para localizar uma janela pelo título você pode usar o comando FindWindow e para finalizar esse aplicativo você pode usar o comando SendMessage passados os parametros solicitando o fechamento do mesmo:::
procedure TForm1.Button1Click(Sender: TObject);
var
Aberto:HWND;
begin
Aberto := FindWindow(nil,´Calculadora´);
if Aberto <> 0 then
SendMessage(Aberto,WM_CLOSE,0,0);
end;
No exemplo eu fecho a Calculadora do Windows, mais pode ser qualquer títlulo, espero ter ajudado! :wink:

Aproveitando o tópico...
Da mesma forma tem como saber se uma pasta do windows for aberta!?

Tipo... c:\teste
se tentarem acessá-la, eu mando uma msg e fecho o programa (que no caso usaria o codigo acima) que está tentando abri-la.

Tem como!?

.lg.


GOSTEI 0
Xprata

Xprata

11/08/2008

Valeu Paulo, funcionou, mas se conseguisse verificar na fila de processos seria mais garantido, pois se o titulo mdar da ja viu...mas ja foi de grande valia a ajuda...
Sabe como verificar o processo?
t+


GOSTEI 0
Martins

Martins

11/08/2008

Valeu Paulo, funcionou, mas se conseguisse verificar na fila de processos seria mais garantido, pois se o titulo mdar da ja viu...mas ja foi de grande valia a ajuda... Sabe como verificar o processo? t+


Fechando um processo vc fecha todos os demais aplicativos ligados ao processo em questão, mas vc poderia dar uma olhada no código abaixo.

[b:3f69c24408]Fonte: [color=red:3f69c24408]DelphiTricks.com[/color:3f69c24408][/b:3f69c24408]
// **************************************************
//  For Windows 9x/ME/2000/XP
// **************************************************
uses
  Tlhelp32;

function KillTask(ExeFileName: string): Integer;
const
  PROCESS_TERMINATE = $0001;
var
  ContinueLoop: BOOL;
  FSnapshotHandle: THandle;
  FProcessEntry32: TProcessEntry32;
begin
  Result := 0;
  FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  FProcessEntry32.dwSize := SizeOf(FProcessEntry32);
  ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);
  while Integer(ContinueLoop) <> 0 do
  begin
    if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
      UpperCase(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) =
      UpperCase(ExeFileName))) then
      Result := Integer(TerminateProcess(
                        OpenProcess(PROCESS_TERMINATE,
                                    BOOL(0),
                                    FProcessEntry32.th32ProcessID),
                                    0));
     ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
  end;
  CloseHandle(FSnapshotHandle);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  KillTask(´notepad.exe´);
end;

// **************************************************
//   For Windows NT/2000/XP
// **************************************************
procedure KillProcess(hWindowHandle: HWND);
var
  hprocessID: INTEGER;
  processHandle: THandle;
  DWResult: DWORD;
begin
  SendMessageTimeout(hWindowHandle, WM_CLOSE, 0, 0,
    SMTO_ABORTIFHUNG or SMTO_NORMAL, 5000, DWResult);
  if isWindow(hWindowHandle) then
  begin
    { Get the process identifier for the window}
    GetWindowThreadProcessID(hWindowHandle, @hprocessID);
    if hprocessID <> 0 then
    begin
      { Get the process handle }
      processHandle := OpenProcess(PROCESS_TERMINATE or PROCESS_QUERY_INFORMATION,
        False, hprocessID);
      if processHandle <> 0 then
      begin
        { Terminate the process }
        TerminateProcess(processHandle, 0);
        CloseHandle(ProcessHandle);
      end;
    end;
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  KillProcess(FindWindow(´notepad´,nil));
end;


O código acima foi postado pelo [b:3f69c24408]Micheus[/b:3f69c24408] em 25/12/2006 no ScripBrasil.

Boa sorte e bons códigos.


GOSTEI 0
Martins

Martins

11/08/2008

[quote:8e1d074b55=´paullsoftware´]bem, para localizar uma janela pelo título você pode usar o comando FindWindow e para finalizar esse aplicativo você pode usar o comando SendMessage passados os parametros solicitando o fechamento do mesmo:::
procedure TForm1.Button1Click(Sender: TObject);
var
Aberto:HWND;
begin
Aberto := FindWindow(nil,´Calculadora´);
if Aberto <> 0 then
SendMessage(Aberto,WM_CLOSE,0,0);
end;
No exemplo eu fecho a Calculadora do Windows, mais pode ser qualquer títlulo, espero ter ajudado! :wink:

Aproveitando o tópico...
Da mesma forma tem como saber se uma pasta do windows for aberta!?

Tipo... c:\teste
se tentarem acessá-la, eu mando uma msg e fecho o programa (que no caso usaria o codigo acima) que está tentando abri-la.

Tem como!?

.lg.[/quote:8e1d074b55]

Amigo dê uma olhada no link abaixo.
[url]https://www.devmedia.com.br/articles/viewcomp.asp?comp=615[/url]
Artigo do [b:8e1d074b55]DANIEL DE FREITAS WILDT[/b:8e1d074b55] - Monitorando Diretórios com FindFirstChangeNotification.

Nunca testei esse código mas vc pode dar uma conferida, mas acredito q vc poderia procurar tb por API Hooking, o Bruno (Nildo) Administrador aqui do fórum, o Michael Benford e eu já falamos do assunto aqui no fórum e o Nildo mantinha um portal com a biblioteca dele sobre o assunto.

Boa sorte.


GOSTEI 0
.lg.

.lg.

11/08/2008

Obrigado pela ajuda. :wink:


GOSTEI 0
Xprata

Xprata

11/08/2008

Obrigado Martins, vou testar...

[quote:8f3d54fe2e=´xprata´]Valeu Paulo, funcionou, mas se conseguisse verificar na fila de processos seria mais garantido, pois se o titulo mdar da ja viu...mas ja foi de grande valia a ajuda... Sabe como verificar o processo? t+


Fechando um processo vc fecha todos os demais aplicativos ligados ao processo em questão, mas vc poderia dar uma olhada no código abaixo.

[b:8f3d54fe2e]Fonte: [color=red:8f3d54fe2e]DelphiTricks.com[/color:8f3d54fe2e][/b:8f3d54fe2e]
// **************************************************
//  For Windows 9x/ME/2000/XP
// **************************************************
uses
  Tlhelp32;

function KillTask(ExeFileName: string): Integer;
const
  PROCESS_TERMINATE = $0001;
var
  ContinueLoop: BOOL;
  FSnapshotHandle: THandle;
  FProcessEntry32: TProcessEntry32;
begin
  Result := 0;
  FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  FProcessEntry32.dwSize := SizeOf(FProcessEntry32);
  ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);
  while Integer(ContinueLoop) <> 0 do
  begin
    if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
      UpperCase(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) =
      UpperCase(ExeFileName))) then
      Result := Integer(TerminateProcess(
                        OpenProcess(PROCESS_TERMINATE,
                                    BOOL(0),
                                    FProcessEntry32.th32ProcessID),
                                    0));
     ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
  end;
  CloseHandle(FSnapshotHandle);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  KillTask(´notepad.exe´);
end;

// **************************************************
//   For Windows NT/2000/XP
// **************************************************
procedure KillProcess(hWindowHandle: HWND);
var
  hprocessID: INTEGER;
  processHandle: THandle;
  DWResult: DWORD;
begin
  SendMessageTimeout(hWindowHandle, WM_CLOSE, 0, 0,
    SMTO_ABORTIFHUNG or SMTO_NORMAL, 5000, DWResult);
  if isWindow(hWindowHandle) then
  begin
    { Get the process identifier for the window}
    GetWindowThreadProcessID(hWindowHandle, @hprocessID);
    if hprocessID <> 0 then
    begin
      { Get the process handle }
      processHandle := OpenProcess(PROCESS_TERMINATE or PROCESS_QUERY_INFORMATION,
        False, hprocessID);
      if processHandle <> 0 then
      begin
        { Terminate the process }
        TerminateProcess(processHandle, 0);
        CloseHandle(ProcessHandle);
      end;
    end;
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  KillProcess(FindWindow(´notepad´,nil));
end;


O código acima foi postado pelo [b:8f3d54fe2e]Micheus[/b:8f3d54fe2e] em 25/12/2006 no ScripBrasil.

Boa sorte e bons códigos.[/quote:8f3d54fe2e]


GOSTEI 0
POSTAR