Jump to content
Fivewin Brasil

Identificar que o windows está sendo desligado (RESOLVIDO)


emotta

Recommended Posts

Um programa muito útil para tarefas assim é o Close All Windows que, além de leve, executa a tarefa proposta com muita rapidez. Após fazer o download, descompacte o conteúdo do arquivo em uma pasta de sua preferência. Agora é só clicar sobre o aplicativo “CloseAll” que todos os programas abertos serão encerrados.

Se você se esquecer de salvar algum documento ou estava com alguma páginaimportante aberta em seu navegador, não se preocupe, o Close All Windows pergunta se deseja salvar as informações antes de encerrar o programa em questão.

https://www.baixaki.com.br/download/close-all-windows.htm

Link to comment
Share on other sites

3 minutos atrás, edmandc disse:

Um programa muito útil para tarefas assim é o Close All Windows que, além de leve, executa a tarefa proposta com muita rapidez. Após fazer o download, descompacte o conteúdo do arquivo em uma pasta de sua preferência. Agora é só clicar sobre o aplicativo “CloseAll” que todos os programas abertos serão encerrados.

Se você se esquecer de salvar algum documento ou estava com alguma páginaimportante aberta em seu navegador, não se preocupe, o Close All Windows pergunta se deseja salvar as informações antes de encerrar o programa em questão.

https://www.baixaki.com.br/download/close-all-windows.htm

 outra opção

https://olhardigital.com.br/2018/11/27/dicas-e-tutoriais/como-fazer-um-programa-fechar-automaticamente-no-windows/

Link to comment
Share on other sites

obrigado pela ajuda mas acho q não fui bem claro no que preciso

vou explicar melhor:

Tenho uma aplicação console que fica em um loop infinito processando tarefas. Preciso identificar que o WINDOWS está sendo desligado e ai eu fechar minha aplicação de maneira suave.

Exemplo:

 

Function u_Teste()
 
While !IsShutdown() .and. LastKey() # 27
    ? "Processando rotina"
    Inkey(1)
EndDo
 
"Rotina finalizada"
Return


 
static Function IsShutdown()
Local lShutDown := .f.
 
lShutDown := [AQUI PRECISO DE UMA FUNCAO PARA RETORNAR SE O WINDOWS ESTÁ SENDO DESLIGADO/REINICIADO/LOGOFF]
 
Return lShutDown
Link to comment
Share on other sites

Bom dia dom Eduardo. Nunca vi nada parecido. Como é que se vai impedir o Windows de se Desligar, se faltar Luz por exemplo? NO BREAK. Se for por CTRL+ALT+DEL, desliga-se os mesmos. Agora, se o usuário mete o dedo no botão de Reiniciar ou Desligar, aferrou-se, como segurar o SHUTDOWN? Não faço ideia. Abs.

Link to comment
Share on other sites

Não estou falando de impedir o desligamento, veja no código que meu desejo é identificar que o windows está desligando o computador e com isso a aplicação ser encerrada de maneira correta, ou seja, saindo do laço (while) e finalizando normalmente a rotina, em vez de finalizar abruptamente com o codigo dentro do laço sendo executado.

Mas é claro que se faltar luz tudo será desligado de maneira abrupta, mas não é isso que desejo resolver, quero resolver a questão de um desligamento normal. Esses casos excepcionais deixa pra la.

Link to comment
Share on other sites

Refiz o código do exemplo que montei para ficar mais fácil de entender minha necessidade

 

Function u_Teste()
 
While LastKey() # 27
    If IsShutdown()  // se o usuário estiver desligando o windows a aplicação sai do laço para que seja finalizado corretamente
        Exit
    EndIf
    ? "Processando rotina"
    Inkey(1)
EndDo
    
"Rotina finalizada"
Return
 
    
static Function IsShutdown()
Local lShutDown := .f.
    
lShutDown := [AQUI PRECISO DE UMA FUNCAO PARA RETORNAR SE O WINDOWS ESTÁ SENDO DESLIGADO/REINICIADO/LOGOFF]
    
Return lShutDown
Link to comment
Share on other sites

** quando a aplicação é GUI (fivewin por exemplo) isso já acontece automaticamente, na janela da window o botão X (fehcar) é acionado quando o windows está sendo desligado.

Já em aplicação console preciso de uma soluçao. Se alguem souber vai me ajudar muito.

abraços

 

Link to comment
Share on other sites

Como fazer isso? 

//SM_SHUTTINGDOWN = 0x2000
bool bShutDownPending = GetSystemMetrics(SM_SHUTTINGDOWN) != 0;
	private static int WM_QUERYENDSESSION = 0x11;
protected override void WndProc(ref System.Windows.Forms.Message m)
{
    if (m.Msg==WM_QUERYENDSESSION)
    {
        MessageBox.Show("queryendsession: this is a logoff, shutdown, or reboot");
    }
    
    base.WndProc(ref m);
}
	Fonte:
	https://stackoverflow.com/questions/6799955/how-to-detect-windows-shutdown-or-logoff
	

Abs.

Link to comment
Share on other sites

5 horas atrás, gilmer disse:

Bom Dia,

Tente ver se isto ajudaria 


//SM_SHUTTINGDOWN = 0x2000
bool bShutDownPending = GetSystemMetrics(SM_SHUTTINGDOWN) != 0;

https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getsystemmetrics

Obs. Isto não funciona se estiver rodando em serviço do windows

 

legal Gilmer, vou tentar isso e reporto aqui se tiver sucesso

 

obrigado

Link to comment
Share on other sites

Gilmer, na mosca, era exatamente isso que precisava. 

Eu preciso disso pois tenho uma VM no azure rodando um programa console que fica em loop. Se pelo painel do azure eu reiniciar a VM eu quero que o programa identifique isso e feche o programa de maneira normal, ou seja, fechando normalmente a conexão com banco de dados e outras coisas.

Segue abaixo um exemplo pra simular a situação. No exemplo o programa finaliza de maneira normal se digitar ESC ou se reiniciar/desligar o windows. Pra saber se foi mesmo fechado normal basta ver o arquivo teste.txt que só escreve que foi terminado de maneira normal se tiver saido do laço.

Function u_Teste()
Local cFile := "c:\teste.txt"
 
While LastKey() # 27 .and. !IsShutDown()
    MemoWrit(cFile, "terminado forçadamente")
    Inkey(.1)
EndDo
 
MemoWrit(cFile, "terminado de maneira normal")
Return
 
#pragma BEGINDUMP
#include "windows.h"
#include "hbapi.h"
#include <stdio.h>
 
#define SM_SHUTTINGDOWN 0x2000
 
HB_FUNC( ISSHUTDOWN )
{
    BOOL  bRetorno = GetSystemMetrics(SM_SHUTTINGDOWN) != 0;;
    hb_retl( bRetorno );
}
#pragma ENDDUMP
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...