Saber quando minha aplicação está sendo fechada...

Delphi

07/12/2007

E ai Galera,


Bem minha dúvida é mais ´escabrosa´, mas como está dificil de conseguir uma ajuda para ela entaum vou tentar um paleativo...

Tem como eu saber quando minha aplicação está sendo fechada através do gerenciado de processos. Ou seja o usuário pressiona ctrl + alt + del e seleciona meu processo e mata-o... tem como eu saber através da minha ~própria aplicação que ela está sendo fechada...???? tipo quando o usuário matar o processo aparece uma mensagem para ele...


Lauro.balceiro

Lauro.balceiro

Curtidas 0

Respostas

Marcosrocha

Marcosrocha

07/12/2007

Saber se a sua aplicação está sendo fechada com CTL+ALT+DELETE é técnicamente impossível.


GOSTEI 0
Sistemald

Sistemald

07/12/2007

Quando você pressione o ctrl alt del e pede para fechar aplicação, ele manda um sinal para aplicação fechar normal, e espera um tempo até matar o processo.

se você usar o onCloseQuery, você saberá que ela esta sendo fechado e só isso, agora se foi pelo ctrl alt del, ou apertou o ´x´ na janela, não sei se tem como pegar.


GOSTEI 0
Lauro.balceiro

Lauro.balceiro

07/12/2007

Entaum galera...

Se o cara for no gerenciador de tarefas, selecionar meu processo e finalizar o processo, eu naum consigo interceptar se o processo está sendo fechado... sei que tem como fazer isso pois já vi isso em uma outra aplicação...

alguém saberia como fazer isso... pode ser através de hooking... sei que tem uns especialistas aqui no site né nildo... tentei usar o BmsApiHook mas mesmo assim naum consegui...

tem como dar uma dica ai meu???

valew


GOSTEI 0
Facc

Facc

07/12/2007

Entaum galera... Se o cara for no gerenciador de tarefas, selecionar meu processo e finalizar o processo, eu naum consigo interceptar se o processo está sendo fechado... sei que tem como fazer isso pois já vi isso em uma outra aplicação... alguém saberia como fazer isso... pode ser através de hooking... sei que tem uns especialistas aqui no site né nildo... tentei usar o BmsApiHook mas mesmo assim naum consegui... tem como dar uma dica ai meu??? valew


E se vc dar um findwindow? procurando o gerenciador de tarefas do Windows? se achar vc emite uma mensagem...


GOSTEI 0
Marcosrocha

Marcosrocha

07/12/2007

E se vc dar um findwindow? procurando o gerenciador de tarefas do Windows? se achar vc emite uma mensagem...

Aí a aplicação do cara vai parecer aqueles vírus que não deixam dar CTRL+ALT+DEL ou fazer qualquer coisa com o PC...
O negócio é que se o Windows Mandou, não tem choro nem vela, sua aplicação vai fechar e pronto acabou!!!
Para ajudá-lo melhor amigo [b:36096fafa4]lauro.balceiro[/b:36096fafa4], eu gostaria de saber qual é o tipo da sua aplicação? É comercial? É um vírus? É o quê? Por que não pode ser fechada pelo usuário?
Pergunto isso pra te dar possíveis soluções ok?


GOSTEI 0
Facc

Facc

07/12/2007

[quote:70242870dc=´Facc´]E se vc dar um findwindow? procurando o gerenciador de tarefas do Windows? se achar vc emite uma mensagem...

Aí a aplicação do cara vai parecer aqueles vírus que não deixam dar CTRL+ALT+DEL ou fazer qualquer coisa com o PC...
O negócio é que se o Windows Mandou, não tem choro nem vela, sua aplicação vai fechar e pronto acabou!!!
Para ajudá-lo melhor amigo [b:70242870dc]lauro.balceiro[/b:70242870dc], eu gostaria de saber qual é o tipo da sua aplicação? É comercial? É um vírus? É o quê? Por que não pode ser fechada pelo usuário?
Pergunto isso pra te dar possíveis soluções ok?[/quote:70242870dc]

na verdade até deixaria dar o CTRL+ALT+DEL, só emitiria um aviso para o usuário que foi precionado e gravaria num log, para verificação caso o o sistema viesse dar algum erro... eu uso esse processo e nunca tive problemas


GOSTEI 0
Lauro.balceiro

Lauro.balceiro

07/12/2007

Enaum [b:afb025bdf3]mcblade[/b:afb025bdf3] minha aplicação é um sistema de controle comercial, onde eu tenho uma tela de frente de caixa que deverá ser fechada apenas se o usuário clicar no botão fechar, pois ai eu faço vários tipos de validações... o problema passa a acontecer se o usuário fechar o processo, ai não teria como fazer essas validações a não ser que eu consiga interceptar esse comportamento.

Realmente não quero desabilitar CTRL + ALT + DEL ou fazer um programa rodando background verificando se a minha janela está ativa ou não... pois isso é um paleativo muuiiittoooo paleativo, queria que minha aplicação fosse auto-suficiente não necessitando dessas soluções paralelas... não estou desmerecendo a solução proposta pelo nosso amigo [b:afb025bdf3]Facc[/b:afb025bdf3] ela é de grande importância, mas no meu caso não atende...

espero que alguém possa me ajudar...


GOSTEI 0
Lauro.balceiro

Lauro.balceiro

07/12/2007

e ai pessoal alguma dica???


GOSTEI 0
Lauro.balceiro

Lauro.balceiro

07/12/2007

desculpe a incistência pessoal, mas é que preciso muito dessa solução...


GOSTEI 0
Weber

Weber

07/12/2007

Pode parecer ´gambiarra´ mas você pode criar um ´guard´, tipo o FBGuard do firebird.

- Crie um serviço separado de seu projeto e este serviço fica encarregado de verificar se sua aplicação fechou.

- Ao abrir sua aplicação veja se seu serviço já esta rodando, se o serviço não estiver rodando então ative ele.


GOSTEI 0
Silviogs

Silviogs

07/12/2007

Olá amigo

tente isso.

Desligando Windows via programação
function ExitWindowsEx(uFlags : integer; // shutdown operation

dwReserved : word) : boolean; // reserved

external ´user32.dll´ name ´ExitWindowsEx´;

procedure Tchau;

const

EWX_LOGOFF = 0; // Dá ´logoff´ no usuário atual

EWX_SHUTDOWN = 1; // ´Shutdown´ padrão do sistema

EWX_REBOOT = 2; // Dá ´reboot´ no equipamento

EWX_FORCE = 4; // Força o término dos processos

EWX_POWEROFF = 8; // Desliga o equipamento

begin

ExitWindowsEx(EWX_FORCE, 0);

end;



Detectando a finalização do Windows
Para detectar a finalização do Windows, deve-se capturar a mensagem WM_ENDSESSION. Estes passos devem ser tomados:

Declarar uma rotina de manipulação de mensagens na sessao private de sua form:

procedure WMEndSession(var Msg : TWMEndSession); message WM_ENDSESSION;
Adicionar a procedure à seção implementation de sua unit:

procedure TForm1.WMEndSession(var Msg : TWMEndSession);
begin
if Msg.EndSession = TRUE then
ShowMessage(´O Windows está finalizando ´ + #13 + ´às ´ +
FormatDateTime(´c´, Now));
inherited;
end;

acho que uma destas dicas pode ajudá-lo

Silvio Guedes


GOSTEI 0
Lauro.balceiro

Lauro.balceiro

07/12/2007

Cara isso naum ajuda, na verdade não quero saber quando o windows será fechado e sim quando minha aplicação estiver sendo finalizado via gerenciados de processos.

mas de qualquer forma muito obrigado


GOSTEI 0
Lauro.balceiro

Lauro.balceiro

07/12/2007

E ai pessoal, alguém se habilita???


GOSTEI 0
Docdoc

Docdoc

07/12/2007

Caros Amigos:

O windows qdo determina o encerramento de um programa envia para este programa uma notificação [b:8b91a00d3c] WM_QUIT[/b:8b91a00d3c], após a notificação o programa sai do looping de mensagens e encerra.

Bem oq ue vc poderá fazer é colocar a sua rotina de finalização ai;


procedure WMQUIT(var Msg : TWMEndSession); message WM_QUIT;
Adicionar a procedure à seção implementation de sua unit:

procedure TForm1.WMQUIT(var Msg : TWMQUIT);
begin
  RotinaDeSalvamento; 
end; 




Se isso ai não resolver, vc poderá tentar com a mensagem WM_CLOSE, mas neste caso vc poderá evitar o encerramento da janela principal do programa simplesmente colocando no campo result da mensagem um valor acima de zero.


GOSTEI 0
Lauro.balceiro

Lauro.balceiro

07/12/2007

Cara essa solução parece que realmente servirá, mas o problema é que dá um erro Unknown directive ´message´...

o que poderia ser isso?


GOSTEI 0
Docdoc

Docdoc

07/12/2007

[b:c00fbc3243]ois,

Acho que todos nós cometemos um grande erro.

Na verdade o Task Manager do Windows parece não enviar mensagem nem notificação para o programa de forma a fechá-lo. O que na verdade faz é usar uma das duas funções KILL ou ENDTASK, que causam interrompimento anormal do processo.

Bem, nesse caso o processo não tem como se defender e todas as informações ligadas a esse processo serão perdidas.

Talvez haja uma forma indireta de evitar o desastre da perda de informações:

Eu proponho que vc crie uma área na memoria onde guarda os dados que você não quer ver perdidos.

Em segundo, crie um outro programa o qual chamaremos de POLICIA. Este programa é lançado no momento do outro e só tem a função de monitorar se o programa principal foi derrubado anormalmente. Caso isso aconteça ai o POLICIA lerá a área da memória que estiver os últimos dados e iniciará sua rotina de salvamento desses dados e posterior encerramento

boa sorte[/b:c00fbc3243]


GOSTEI 0
Lauro.balceiro

Lauro.balceiro

07/12/2007

Galera,

A solução proposta acima é bem coerente, mas queria que minha aplicação pelo menos ´soubesse´ que estavam matando seu processo e ela mesma chamasse esse programa policia...

naum quero fazer um programinha rodando background, acho isso muito ´viral´.


valews


GOSTEI 0
Lauro.balceiro

Lauro.balceiro

07/12/2007

E ai pessoal, nada???


GOSTEI 0
Docdoc

Docdoc

07/12/2007

Não sei se isso é possível...

O Task Manager é pior do que o capitão Nascimento, [b:c4e43ac1cb][i:c4e43ac1cb]pede pra sair ! pede pra sair![/i:c4e43ac1cb][/b:c4e43ac1cb]

Acho que nem se quer é possível fazer o que vc pede, talvez procure pesquisar em Objetos do Kernel, quem sabe haja alguma sinalização nesse sentido.

Repare, acho que quando a ´casa cai´ pro processo o proprio Kernel se encarrega disso e como o Kernel roda em anel Zero, não creio que tenhamos acesso a isso.


GOSTEI 0
Lauro.balceiro

Lauro.balceiro

07/12/2007

Bom vou continuar na esperança de aparecer alguém que me fale o contrário.. enquanto iss continuarei varrendo a web em busca de uma solução...


GOSTEI 0
Lauro.balceiro

Lauro.balceiro

07/12/2007

Espero que em 2008 eu consiga a resposta, pq em 2007 rsssss.....


GOSTEI 0
Paulo Fossá

Paulo Fossá

07/12/2007

lauro.balceiro

Vc conseguiu a solução para este problema? Estou com situação parecida e quero saber quando o windows finaliza minha aplicação.

No aguardo.
GOSTEI 0
POSTAR