Listar executáveis em execução

18/06/2009

0

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

Responder

Posts

02/07/2009

Nasguone

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.


Responder

21/07/2017

Fabricio Martins

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.
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

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

Aceitar