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

)
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()