emotta Posted October 4, 2021 Report Share Posted October 4, 2021 Estou usando o xHarbour console e quero identificar quando o windows está sendo desligado e com isso finalizar meu programa antes do windows fechar ele forçadamente. Alguem sabe como fazer isso? Quote Link to comment Share on other sites More sharing options...
edmandc Posted October 4, 2021 Report Share Posted October 4, 2021 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 Quote Link to comment Share on other sites More sharing options...
edmandc Posted October 4, 2021 Report Share Posted October 4, 2021 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/ Quote Link to comment Share on other sites More sharing options...
edmandc Posted October 4, 2021 Report Share Posted October 4, 2021 ou https://www.topgadget.com.br/howto/windows/tabela-de-opcoes-do-comando-shutdown-que-desliga-o-computador.htm Quote Link to comment Share on other sites More sharing options...
emotta Posted October 4, 2021 Author Report Share Posted October 4, 2021 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 Quote Link to comment Share on other sites More sharing options...
kapiaba Posted October 5, 2021 Report Share Posted October 5, 2021 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. Quote Link to comment Share on other sites More sharing options...
emotta Posted October 5, 2021 Author Report Share Posted October 5, 2021 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. Quote Link to comment Share on other sites More sharing options...
emotta Posted October 5, 2021 Author Report Share Posted October 5, 2021 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 Quote Link to comment Share on other sites More sharing options...
emotta Posted October 5, 2021 Author Report Share Posted October 5, 2021 ** 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 Quote Link to comment Share on other sites More sharing options...
kapiaba Posted October 5, 2021 Report Share Posted October 5, 2021 Pasta de C:\Windows\System32 shutdown.exe Talvez, no forum da Microsoft ou em um forum de programadores MODO CONSOLE, como o www.pctoledo.com.br So sorry, essa eu não tenho nem ideia. Abs. Quote Link to comment Share on other sites More sharing options...
emotta Posted October 5, 2021 Author Report Share Posted October 5, 2021 Kapiaba, vc não entendeu ainda, eu não quero fazer o shutdown... Eu quero identificar que um shutdown está acontecendo, veja meu código de exemplo é aquilo q preciso resolver. vlwww pela tentativa Quote Link to comment Share on other sites More sharing options...
kapiaba Posted October 5, 2021 Report Share Posted October 5, 2021 Eu entendi Eduardo, só não sei fazer. Mostrei o SHUTDOWN.exe, para você ver os comandos ou perguntar no forum da Microsoft como você "pega" os comandos dele para poder dizer ao seu programa, para sair e gravar antes do desligamento fatal. Quote Link to comment Share on other sites More sharing options...
gilmer Posted October 6, 2021 Report Share Posted October 6, 2021 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 Quote Link to comment Share on other sites More sharing options...
kapiaba Posted October 6, 2021 Report Share Posted October 6, 2021 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. Quote Link to comment Share on other sites More sharing options...
emotta Posted October 6, 2021 Author Report Share Posted October 6, 2021 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 Quote Link to comment Share on other sites More sharing options...
emotta Posted October 6, 2021 Author Report Share Posted October 6, 2021 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 Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.