Verificar se um determinado programa está aberto
Senhores,
Eu tenho visto neste fórum algumas rotinas que permitem descobrir quais os programas que estão abertos, existe até uma maneira de fechar os mesmos programas caso que estejam abertos. Mas o que eu preciso saber se um determinado executável está em execução. Exemplo: Eu tenho uma aplicação que o nome dela é Módulo Gestor de Material, o nome do executável MGM.EXE. Existe alguma maneira verificar essa aplicação está em execução pelo nome executável? Alguma que eu pudesse checar pelo nome do executável? Semelhando ao que aparece no gerenciador de tarefas do windows na aba Processos.
Agradeço a quem puder, me ajudar.
Eu tenho visto neste fórum algumas rotinas que permitem descobrir quais os programas que estão abertos, existe até uma maneira de fechar os mesmos programas caso que estejam abertos. Mas o que eu preciso saber se um determinado executável está em execução. Exemplo: Eu tenho uma aplicação que o nome dela é Módulo Gestor de Material, o nome do executável MGM.EXE. Existe alguma maneira verificar essa aplicação está em execução pelo nome executável? Alguma que eu pudesse checar pelo nome do executável? Semelhando ao que aparece no gerenciador de tarefas do windows na aba Processos.
Agradeço a quem puder, me ajudar.
Chmeireles
Curtidas 0
Respostas
Antoniologica
21/04/2005
Um alternativa...
Você pode tentar renomear o executável, se o Windows permitir é porque o programa não está sendo executado no momento, e depois volta o nome dele novamente.
Você pode tentar renomear o executável, se o Windows permitir é porque o programa não está sendo executado no momento, e depois volta o nome dele novamente.
GOSTEI 0
Rodc
21/04/2005
Veja se este post lhe ajuda:
[url]http://forum.devmedia.com.br/viewtopic.php?t=49290&highlight=execut¬E1vel+handle&sid=89ed27d44514588c753c8b214ea7909e[/url]
[url]http://forum.devmedia.com.br/viewtopic.php?t=49290&highlight=execut¬E1vel+handle&sid=89ed27d44514588c753c8b214ea7909e[/url]
GOSTEI 0
Marco Salles
21/04/2005
P:S Da dica pstada pelo Kapak em :
http://forum.devmedia.com.br/viewtopic.php?t=60180&highlight=handle&sid=e75d156eec7714716ca7ebfd11415faf
[b:77503e3d0c]para Chamar a Função tente :[/b:77503e3d0c]
http://forum.devmedia.com.br/viewtopic.php?t=60180&highlight=handle&sid=e75d156eec7714716ca7ebfd11415faf
Function VerficarSeAplicaticoEstarRodandoPeloNomeDoExecutavel(Nome:String):Boolean; var rId:array[0..999] of DWord; i,NumProc,NumMod:DWord; HProc,HMod:THandle; sNome:String; Tamanho, Count:Integer; sNomeTratado:String; begin result:=False; SetLength(sNome, 256); // Aqui vc pega os IDs dos processos em execução EnumProcesses(@rId[0], 4000, NumProc); // Aqui vc faz um for p/ pegar cada processo for i := 0 to NumProc div 4 do begin // Aqui vc seleciona o processo HProc := OpenProcess(Process_Query_Information or Process_VM_Read, FALSE, rId[i]); if HProc = 0 then Continue; // Aqui vc pega os módulos do processo // Como vc só quer o nome do programa, então será sempre o primeiro EnumProcessModules(HProc, @HMod, 4, NumMod); // Aqui vc pega o nome do módulo; como é o primeiro, é o nome do programa GetModuleBaseName(HProc, HMod, @sNome[1], 256); sNomeTratado := trim(sNome); Tamanho:=Length(SnomeTratado); Count:=1; While Count <= Tamanho do begin if SnomeTratado[Count]= ´´ Then Break; count:=Count+1; end; sNomeTratado:=Copy(SnomeTratado,1,Count-1); if AnsiUpperCase(sNomeTratado)=AnsiUpperCase(Nome) Then Result:=True; // Aqui vc libera o handle do processo selecionado CloseHandle(HProc); end; end;
[b:77503e3d0c]para Chamar a Função tente :[/b:77503e3d0c]
procedure TForm1.Button3Click(Sender: TObject); begin if VerficarSeAplicaticoEstarRodandoPeloNomeDoExecutavel(´CalC.EXE´) Then showmessage(´Esta Rodando´) else Showmessage(´Não esta Rodando´); end;
GOSTEI 0
Chmeireles
21/04/2005
Valeu amigão!
Ajudou-me bastante!
Ajudou-me bastante!
GOSTEI 0
Dpinho
21/04/2005
preciso utilizar esta função, mas gostaria de acrescentar um linha antes do result fechando o processo (encerrado o programa).
Alguem poderia me ajudar
Tentei utilizar a linha abaixo mas não deu nada, estou testando com o msn
TerminateProcess(OpenProcess($0001,false,processo),0);
grato
Alguem poderia me ajudar
Tentei utilizar a linha abaixo mas não deu nada, estou testando com o msn
TerminateProcess(OpenProcess($0001,false,processo),0);
grato
GOSTEI 0
Kapak
21/04/2005
Tentei utilizar a linha abaixo mas não deu nada, estou testando com o msn
TerminateProcess(OpenProcess($0001,false,processo),0);
Provavelmente vc não está conseguindo um Handle no OpenProcess.
Execute em duas etapas e veja se dá alguma mensagem:
var H:THandle; begin H := OpenProcess($0001,false,processo); if H = 0 then ShowMessage(SysErrorMessage(GetLastError)) else if not TerminateProcess(H, 0) then ShowMessage(SysErrorMessage(GetLastError)); end;
GOSTEI 0
Marco Salles
21/04/2005
preciso utilizar esta função, mas gostaria de acrescentar um linha antes do result fechando o processo (encerrado o programa).
[b:2901aba6dd]Porque não fecha após o teste [/b:2901aba6dd] :?: :?: :?:
procedure TForm1.Button3Click(Sender: TObject);
begin
if VerficarSeAplicaticoEstarRodandoPeloNomeDoExecutavel(´CalC.EXE´) Then
begin
showmessage(´Esta Rodando´) ;
Fechar
end
else
Showmessage(´Não esta Rodando´);
end;
GOSTEI 0
Dpinho
21/04/2005
[quote:bf0f1ffc29=´Marco Salles´]
[b:bf0f1ffc29]Porque não fecha após o teste [/b:bf0f1ffc29] :?: :?: :?:
procedure TForm1.Button3Click(Sender: TObject);
begin
if VerficarSeAplicaticoEstarRodandoPeloNomeDoExecutavel(´CalC.EXE´) Then
begin
showmessage(´Esta Rodando´) ;
Fechar
end
else
Showmessage(´Não esta Rodando´);
end;[/quote:bf0f1ffc29]
Estou utilizando assim mesmo e retornar que o processo esta aberto porem não fecha quano o caso é messeger
preciso utilizar esta função, mas gostaria de acrescentar um linha antes do result fechando o processo (encerrado o programa).
[b:bf0f1ffc29]Porque não fecha após o teste [/b:bf0f1ffc29] :?: :?: :?:
procedure TForm1.Button3Click(Sender: TObject);
begin
if VerficarSeAplicaticoEstarRodandoPeloNomeDoExecutavel(´CalC.EXE´) Then
begin
showmessage(´Esta Rodando´) ;
Fechar
end
else
Showmessage(´Não esta Rodando´);
end;[/quote:bf0f1ffc29]
Estou utilizando assim mesmo e retornar que o processo esta aberto porem não fecha quano o caso é messeger
GOSTEI 0
Marco Salles
21/04/2005
Estou utilizando assim mesmo e retornar que o processo esta aberto porem não fecha quano o caso é messeger
Como voce esta chamando a função , isto é , qual o nome do executável
:?: :?: :?: :?:
e qual a instrução que voce esta usando para fechar este executável
:?: :?: :?: :?: :?:
em sintase , dispoe esse código para a gente
GOSTEI 0
Mário Reis
21/04/2005
Amigos,
Tento usar esta aplicação numa rede local e não funciona! Tenho a apilicção correndo num servidor Windows Small Business Server 2008 em uma pasta partilhada com atalhos para os executáveis(Delphi XE+FB2.5.4) chamados a partir de estações cliente. Tentei actualizar esse executável, porém, sem sucesso porque estava sendo utilizado em uma outra aplicação. Depois de correr o "Gestor de Tarefas do Windows7 e 8.1" em cada uma delas não aparecia na lista de processos activos de nenhuma delas.
A solução foi ir abatendo uma a uma e ir tentando até que aquela que estava a prende-lo caiu e o executável foi então substituído no Sever com sucesso.
Fui à procura de uma solução para prevenir-me contra estas situações e encontrei este código que tento usar porém sem sucesso!? Deveria funcionar?
O que estarei a fazer mal? Que mais posso tentar? Obrigado
Mário Reis
Tento usar esta aplicação numa rede local e não funciona! Tenho a apilicção correndo num servidor Windows Small Business Server 2008 em uma pasta partilhada com atalhos para os executáveis(Delphi XE+FB2.5.4) chamados a partir de estações cliente. Tentei actualizar esse executável, porém, sem sucesso porque estava sendo utilizado em uma outra aplicação. Depois de correr o "Gestor de Tarefas do Windows7 e 8.1" em cada uma delas não aparecia na lista de processos activos de nenhuma delas.
A solução foi ir abatendo uma a uma e ir tentando até que aquela que estava a prende-lo caiu e o executável foi então substituído no Sever com sucesso.
Fui à procura de uma solução para prevenir-me contra estas situações e encontrei este código que tento usar porém sem sucesso!? Deveria funcionar?
O que estarei a fazer mal? Que mais posso tentar? Obrigado
Mário Reis
GOSTEI 0