Listar executáveis em execução

Delphi

18/06/2009

Galera, estou procurando a um tempão já e não acho em lugar nenhum como listar no delphi todos os programas que estão em execução no momento.

Varios exemplos que encontrei utilizam o findwindow, mas este não funciona para mim pois o programa que estou procurando não tem janela em exibição.

Tenho um programa que roda tanto como tarefa quanto como serviço, e tenho uma funçãozinha para não permitir que ele seja executado mais de uma vez simultaneamente (utilizando o createmutex), ocorre que quando ele está iniciado como serviço, se eu tentar executar diretamente a partir do EXE, ele não detecta que a outra instancia ja está em execução e abre o programa novamente. Ja tentei de tudo para tentar fazer com que ele enxergue mas não vai.

Por este motivo estou achando que a saída será procurar pelo executável em execução, se ja exisitr o outro executável na memória quer dizer que o programa ja esta aberto.

Alguém sabe como posso fazer isso? Ou então uma maneira de conseguir fazer o mutex identificar o serviço no ar?

Em tempo, ja tentei fazer esse controle também usando o componente Jedi, TJVAppInstances, mas este também não funcionou.

Obrigado.


Prgdelphi

Prgdelphi

Curtidas 0

Respostas

Nasguone

Nasguone

18/06/2009

coloqe no form um botao e um memo - o processo lista todos os aplicaivos rodando tipo gerenciador detrefas do windows.

Espero qu te ajude
E.C.S




unit main;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TMainForm = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
MainForm: TMainForm;

implementation
{$R *.dfm}

function EnumWindowsFunc(Handle: THandle; List: TStringList) : boolean ; stdcall;
var
caption: array[0..256] of Char;
begin
if GetWindowText (Handle, Caption, SizeOf(Caption)-1) <> 0 then
begin
List.Add(Caption) ;
SetWindowText(Handle, PChar(´About - ´ + Caption)) ;
end;

result :=True;
end;

procedure TMainForm.Button1Click(Sender: TObject);
begin
Memo1.Clear;
EnumWindows(@EnumWindowsFunc, LParam(Memo1.Lines)) ;
end;

end.


GOSTEI 0
Fabricio Martins

Fabricio Martins

18/06/2009

Nossa eu estou querendo fazer algo assim porem quando tento usar o seus condigos fica dando erro na esguite linha em About não sei se é eu que estou sem logica de comandos. :\\

SetWindowText(Handle, PChar(´About - ´ + Caption)) ;

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure Memo1Change(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function EnumWindowsFunc(Handle: THandle; List: TStringList) : boolean ; stdcall;
var
caption: array[0..256] of Char;
begin
if GetWindowText (Handle, Caption, SizeOf(Caption)-1) <> 0 then
begin
List.Add(Caption) ;
SetWindowText(Handle, PChar(´About - ´ + Caption)) ;
end;

result :=True;
end;

procedure TForm.Button1Click(Sender: TObject);
begin
Memo1.Clear;
EnumWindows(@EnumWindowsFunc, LParam(Memo1.Lines)) ;
end;





end.
GOSTEI 0
POSTAR