Página 1 de 3

Detectar que o Windows está sendo desligado

Enviado: 19 Jun 2016 09:00
por asimoes
Pessoal,

Existe alguma função que detecte que o windows está sendo desligado ou logoff ? para proteger o sistea de eventuais perdas de dados.

Detectar que o Windows está sendo desligado

Enviado: 19 Jun 2016 11:22
por fladimir
Não sei como isso é possível...

Mas tem um tópico no fórum Xailer falando sobre isto... dá pra ter uma ideia e quem sabe te ajude... segue link

Parece q é algo relacionado ao WM_ENDSESSION message do Windows...

Aki fala sobre como mandar encerrar o Windows... quem sabe da pra nesse código pensar em algo pra saber se esta sendo desligado.

Detectar que o Windows está sendo desligado

Enviado: 19 Jun 2016 11:45
por asimoes
Olá Fladimir,

Eu achei essa informação no MSDN mas não sei como implementar.

https://msdn.microsoft.com/pt-br/librar ... s.85).aspx

WindowProc callback function

An application-defined function that processes messages sent to a window. The WNDPROC type defines a pointer to this callback function.

WindowProc is a placeholder for the application-defined function name.

Código: Selecionar todos

LRESULT CALLBACK WindowProc(
  _In_ HWND   hwnd,
  _In_ UINT   uMsg,
  _In_ WPARAM wParam,
  _In_ LPARAM lParam
);

Código: Selecionar todos

LRESULT CALLBACK windowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
    //...       
    case WM_QUERYENDSESSION: return TRUE;       
    case WM_ENDSESSION: 
         if(wParam) PostQuitMessage(0);         
    break;    
    default:
        return DefWindowProc(hwnd,msg,wParam,lParam);
    }

    return FALSE;
}

Detectar que o Windows está sendo desligado

Enviado: 19 Jun 2016 12:16
por asimoes
A situação é a seguinte, um processo é iniciado em um determinado horário e não pode ser interrompido, mas no momento do processo, o servidor fez um shutdown ou logoff isso precisa ser interceptado para que a aplicação faça um registro "em que pé tá o processamento", será que eu viajei muito ?

Detectar que o Windows está sendo desligado

Enviado: 19 Jun 2016 13:50
por JoséQuintas
Não entendi.
Porque precisa saber se o Windows desligou?
Não é só a rotina saber se terminou?

Detectar que o Windows está sendo desligado

Enviado: 19 Jun 2016 16:10
por asimoes
Quintas,

A questão não é saber que o windows desligou e sim que ele está sendo encerrado, pescou?

Detectar que o Windows está sendo desligado

Enviado: 19 Jun 2016 16:22
por JoséQuintas

Código: Selecionar todos

IF File( "naoterminou.txt" )
   MsgExclamation( "Rotina não foi terminada na vez anterior" )
   RETURN
ENDIF
MemoWrit( "naoterminou.txt", "teste" )
DO WHILE .NOT. Eof()
    SKIP
ENDDO
CLOSE DATABASES
fErase( "naoterminou.txt" )

Detectar que o Windows está sendo desligado

Enviado: 19 Jun 2016 17:30
por asimoes
Quintas,

A situação é em uma atualização critica, tem que iniciar e finalizar sem interrupções.
Sei que em caso de processo incompleto, teria que voltar o backup.
A ideia então é saber aonde parou o processamento e continuar a partir dele ou antes dele.

Detectar que o Windows está sendo desligado

Enviado: 19 Jun 2016 18:28
por janio
aSimoes,

O Quintas compreende coisas difíceis, mas não as fáceis! kkkk

:D :D :))

Eu entendi o que vc deseja e adoraria se isso existisse tbm: a aplicação detectar que foi pedido por alguma criatura para que o Windows seja desligado ou reiniciado. Como o processo é crítico e tem que ir até o fim, o ideal era o sistema detectar esse pedido de desligamento e antes de que se complete, apresentar msg: "AMIGÃO, TO FAZENDO UMA ATUALIZACAO AQUI DE TABELAS QUE NÃO PODE PARAR! VA TOMAR UM CAFÉ, BEBER UMA ÁGUA, DORMIR UM POUCO, MAS NAO DESLIGUE O WINDOWS AGORA"

Problemas:
Se a atualização estiver sendo executada no servidor e for este que estiver sendo desligado... ok, talvez daria para impedir esse desligamento. Mas se a atualização estiver sendo processada numa estação e estiverem desligando o servidor... aí complica o meio de campo

Janio

Detectar que o Windows está sendo desligado

Enviado: 19 Jun 2016 18:32
por asimoes
Janio,

Você captou a minha ideia.

O difícil é criar a função que é em C para interceptar o momento que o windows entra em modo de desligamento ou logoff

Detectar que o Windows está sendo desligado

Enviado: 19 Jun 2016 18:43
por janio
aSimoes,

Talvez uma solução 'quebra-galho' seria retirar o poder do usuário fazer o desligamento do Windows, através do registro (gpedit.msc)!

Janio

Detectar que o Windows está sendo desligado

Enviado: 19 Jun 2016 18:49
por janio
aSimoes,

Fazer essa interceptação é possível! Veja o programa do link abaixo:

http://www.baboo.com.br/software/proiba ... de-seu-pc/

Basta alguém que desenvolva isso para embutirmos nos nossos sistemas!
:-´

Janio

Detectar que o Windows está sendo desligado

Enviado: 19 Jun 2016 20:20
por JoséQuintas
Eu ainda não entendi o uso prático.
Se o computador parou.... parou..... rs

No VB tem algo nesse sentido, que é como foi solicitado o fechamento da janela, se foi o usuário ou o Windows e algo mais.

Código: Selecionar todos

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
End Sub
Mas o mais prático é o aplicativo controlar ele mesmo.

O usuário pode muito bem ir lá no gerenciador de tarefas e fechar a aplicação, e isso não seria o Windows desligando.

Detectar que o Windows está sendo desligado

Enviado: 19 Jun 2016 20:31
por asimoes
Tem como enganar a forma é lusitana

Todas as janelas windows são encerradas com Escape, então, no momento do processamento colocar em idle a função escape()
Desta forma se a aplicação não desativar o escape, vai ter que desligar no botão, kkkkk

Código: Selecionar todos

STATIC nIdle
STATIC nTempo

AtivaEscape(.T.) //Ativa o escape
AtivaEscape()    //Desativa o escape

FUNCTION AtivaEscape(lAtiva)
PUBLIC nTmpSistema := 1 // 1 segundo
   hb_Default(@lAtiva, .F.)
   IF lAtiva
      nIdle := hb_IdleAdd( {|| CheckEscape() } )
   ELSE   
      IF nIdle != Nil
         hb_IdleDel( nIdle )
      ENDIF
   ENDIF
RETURN .T.  

FUNCTION CheckEscape
   IF nTempo = Nil
      nTempo := Seconds()
   ENDIF
   IF Seconds() - nTempo >= nTmpSistema
      Escape()
      nTempo := Seconds()
   ENDIF
RETURN Nil

FUNCTION Escape()
   oShell := Win_OleCreateObject( "WScript.Shell" )
   oShell:SendKeys("{ESC}")
RETURN .T.


Detectar que o Windows está sendo desligado

Enviado: 19 Jun 2016 20:38
por asimoes
AtivaEscape(.T.)
DO WHILE .T.
.... processando alguma coisa
ENDDO
...Terminou
AtivaEscape()