 |
ActiveDelphi .: O site do programador Delphi! :.
|
Exibir mensagem anterior :: Exibir próxima mensagem |
Autor |
Mensagem |
FelipeArruda Aprendiz

Registrado: Sábado, 1 de Junho de 2013 Mensagens: 174
|
Enviada: Qua Set 28, 2016 7:19 am Assunto: [RESOLVIDO] - Bloquear Programa externo |
|
|
Bom dia amigos, estou tendo um problema e nao estou achando uma real solução para o mesmo, e o seguinte:
Quero que assim que crie meu Formulario, automaticamente feche um programa externo. Ex: Clipp.exe
Ja tentei dessas formar e sem sucesso.
PostMessage(FindWindow(nil, 'Clipp'), WM_CLOSE, 0,0);
PostMessage(FindWindow(nil, 'Clipp.exe'), WM_CLOSE, 0,0);
O que estaria de errado????
Obrigado, tenham um bom dia
Editado pela última vez por FelipeArruda em Ter Out 04, 2016 9:07 am, num total de 2 vezes |
|
Voltar ao Topo |
|
 |
leo_cj Colaborador

Registrado: Sábado, 26 de Março de 2011 Mensagens: 1335
|
Enviada: Qua Set 28, 2016 8:45 am Assunto: |
|
|
Se você procurar esse programa no gerenciador de tarefas, na aba processos, qual o nome que aparece na coluna descrição? |
|
Voltar ao Topo |
|
 |
FelipeArruda Aprendiz

Registrado: Sábado, 1 de Junho de 2013 Mensagens: 174
|
Enviada: Qua Set 28, 2016 8:57 am Assunto: |
|
|
leo_cj escreveu: | Se você procurar esse programa no gerenciador de tarefas, na aba processos, qual o nome que aparece na coluna descrição? |
Clipp.EXE |
|
Voltar ao Topo |
|
 |
leo_cj Colaborador

Registrado: Sábado, 26 de Março de 2011 Mensagens: 1335
|
Enviada: Qua Set 28, 2016 9:34 am Assunto: |
|
|
Eu fiz assim aqui
Peguei um programinha de utilidades que uso aqui na empresa
NCu.exe
O caption da tela principal é : NC - Utilities
usei o código:
Código: |
PostMessage(FindWindow(nil, 'NC - Utilities'), WM_CLOSE, 0,0);
|
ai funcionou |
|
Voltar ao Topo |
|
 |
FelipeArruda Aprendiz

Registrado: Sábado, 1 de Junho de 2013 Mensagens: 174
|
Enviada: Qua Set 28, 2016 9:50 am Assunto: |
|
|
O problema e que o mesmo possui um Splash.
Eu tentei fazer pelo nome do processo e vi que tem como fazer pela classe do programa, mas nao sei como olhar essa tal classe? |
|
Voltar ao Topo |
|
 |
leo_cj Colaborador

Registrado: Sábado, 26 de Março de 2011 Mensagens: 1335
|
Enviada: Qua Set 28, 2016 10:05 am Assunto: |
|
|
O 'NC - Utilities' não é o nome do processo, e sim o valor do caption do form
Se você tiver acesso ao fonte do programa, você consegue ver o nome da classe pelo código
no meu caso, minha classe está assim:
Código: |
type
TMainForm = class(TForm)
|
minha classe chama TMainForm e o código ficou assim
Código: |
PostMessage(FindWindow('TMainForm', nil), WM_CLOSE, 0,0);
|
Para pegar o nome da classe, utilizei esse código:
Código: |
procedure TForm1.Timer1Timer(Sender: TObject);
var
H: HWND;
ClassName: Array[0..255] of Char;
begin
H := GetForegroundWindow;
GetClassName(H, ClassName, SizeOf(ClassName));
Memo1.Lines.Add('Classe-> '+ClassName);
end;
|
|
|
Voltar ao Topo |
|
 |
marcieldeg Colaborador


Registrado: Terça-Feira, 5 de Abril de 2011 Mensagens: 1054 Localização: Vitória - ES
|
|
Voltar ao Topo |
|
 |
FelipeArruda Aprendiz

Registrado: Sábado, 1 de Junho de 2013 Mensagens: 174
|
Enviada: Qua Set 28, 2016 3:47 pm Assunto: |
|
|
leo_cj - Boa Tarde, então, não tenho o código fonte do programa o qual quero finalizar.
marcieldeg - Boa Tarde, não entendi como utilizar esse código que citou[/quote] |
|
Voltar ao Topo |
|
 |
leo_cj Colaborador

Registrado: Sábado, 26 de Março de 2011 Mensagens: 1335
|
Enviada: Qua Set 28, 2016 3:56 pm Assunto: |
|
|
FelipeArruda escreveu: | leo_cj - Boa Tarde, então, não tenho o código fonte do programa o qual quero finalizar.
marcieldeg - Boa Tarde, não entendi como utilizar esse código que citou | [/quote]
boa tarde,
no meu último comentário eu coloquei um jeito de descobrir a classe
Código: |
procedure TForm1.Timer1Timer(Sender: TObject);
var
H: HWND;
ClassName: Array[0..255] of Char;
begin
H := GetForegroundWindow;
GetClassName(H, ClassName, SizeOf(ClassName));
Memo1.Lines.Add('Classe-> '+ClassName);
end;
|
esse código vai pegar a classe da janela ativa e printar no memo1
porém, o que o amigo marcieldeg disse é fato, o FindWindow é muito sujeito a falhas.
para utilizar o código que ele sugeriu, você precisa passar o nome do executável desejado, exemplo:
Código: |
killtask('Clipp.exe');
|
|
|
Voltar ao Topo |
|
 |
FelipeArruda Aprendiz

Registrado: Sábado, 1 de Junho de 2013 Mensagens: 174
|
Enviada: Qua Set 28, 2016 4:09 pm Assunto: |
|
|
leo_cj escreveu: | FelipeArruda escreveu: | leo_cj - Boa Tarde, então, não tenho o código fonte do programa o qual quero finalizar.
marcieldeg - Boa Tarde, não entendi como utilizar esse código que citou |
|
boa tarde,
no meu último comentário eu coloquei um jeito de descobrir a classe
Código: |
procedure TForm1.Timer1Timer(Sender: TObject);
var
H: HWND;
ClassName: Array[0..255] of Char;
begin
H := GetForegroundWindow;
GetClassName(H, ClassName, SizeOf(ClassName));
Memo1.Lines.Add('Classe-> '+ClassName);
end;
|
esse código vai pegar a classe da janela ativa e printar no memo1
porém, o que o amigo marcieldeg disse é fato, o FindWindow é muito sujeito a falhas.
para utilizar o código que ele sugeriu, você precisa passar o nome do executável desejado, exemplo:
Código: |
killtask('Clipp.exe');
| [/quote]
Certo descobri a classe TFormSenha
Entao seria isso?
PostMessage(FindWindow('TFormSenha', nil), WM_CLOSE, 0,0);
Quero que quando a pessoa execute o Clipp.exe seja finalizado caso essa aplicação que estou fazendo ja esteje rodando |
|
Voltar ao Topo |
|
 |
leo_cj Colaborador

Registrado: Sábado, 26 de Março de 2011 Mensagens: 1335
|
Enviada: Qua Set 28, 2016 4:12 pm Assunto: |
|
|
seria isso
mas você quer que ao executar sua aplicação seja finalizado o processo do clipp.exe ou você quer que se sua aplicação estiver rodando não execute o clipp.exe?
se for a primeira, só esse código já basta, caso seja a segunda, você vai precisar usar um TTimer ou criar uma thread para ficar verificando se o processo existe e caso exista, finalizá-lo. |
|
Voltar ao Topo |
|
 |
FelipeArruda Aprendiz

Registrado: Sábado, 1 de Junho de 2013 Mensagens: 174
|
Enviada: Qua Set 28, 2016 4:17 pm Assunto: |
|
|
leo_cj escreveu: | seria isso
mas você quer que ao executar sua aplicação seja finalizado o processo do clipp.exe ou você quer que se sua aplicação estiver rodando não execute o clipp.exe?
se for a primeira, só esse código já basta, caso seja a segunda, você vai precisar usar um TTimer ou criar uma thread para ficar verificando se o processo existe e caso exista, finalizá-lo. |
seria essa segunda opção, como ficaria o código então? |
|
Voltar ao Topo |
|
 |
leo_cj Colaborador

Registrado: Sábado, 26 de Março de 2011 Mensagens: 1335
|
Enviada: Qua Set 28, 2016 4:39 pm Assunto: |
|
|
coloque esse código em um timer
Código: |
var
Handle: THandle;
begin
Handle := FindWindow('TFormSenha ', nil);
if Handle <> 0 then begin
PostMessage(Handle, WM_Close, 0, 0);
end;
|
|
|
Voltar ao Topo |
|
 |
FelipeArruda Aprendiz

Registrado: Sábado, 1 de Junho de 2013 Mensagens: 174
|
Enviada: Qua Set 28, 2016 4:44 pm Assunto: |
|
|
Nao funciona.
Código: | procedure TFRPrincipal.Timer1Timer(Sender: TObject);
var
Handle: THandle;
begin
Handle := FindWindow('TFormSenha ', nil);
if Handle <> 0 then begin
PostMessage(Handle, WM_Close, 0, 0);
end;
end; |
|
|
Voltar ao Topo |
|
 |
leo_cj Colaborador

Registrado: Sábado, 26 de Março de 2011 Mensagens: 1335
|
Enviada: Qua Set 28, 2016 4:59 pm Assunto: |
|
|
o Timer está como enabled = true?
se sim, da algum erro ou não acontece nada?
se não acontece nada, quando abrir o programa que deve ser fechado, coloque um breakpoint no evento do timer e verifique o que está ocorrendo |
|
Voltar ao Topo |
|
 |
|
|
Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido Editar Mensagens: Proibido. Excluir Mensagens: Proibido. Votar em Enquetes: Proibido.
|
|