impedir desligamento do Windows pelo programa

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

impedir desligamento do Windows pelo programa

Mensagem por cjp »

Pessoal, vocês sabem me informar se tem como um programa compilado no xHarbour impedir (ou ao menos retardar) o desligamento ou o Log off do Windows?

É que o meu programa executa algumas operações necessárias antes de fechar, que não deveriam ser impedidas pelo usuário fazendo log off ou desligando. Assim, eu gostaria de impedir o log off ou o desligamento pelo usuário, para que ele não interrompa as operações do programa antes de fechar, me entenderam?

É possível?

Inacio
Inacio de Carvalho Neto
emotta
Usuário Nível 1
Usuário Nível 1
Mensagens: 4
Registrado em: 07 Fev 2008 09:56
Localização: Nova Odessa

impedir desligamento do Windows pelo programa

Mensagem por emotta »

Se você usa Fivewin ou qualquer outra GUI é simples. Quando o usuário manda DESLIGAR o computador o WINDOWS "simula" como se o usuário fosse fechando as janelas no X (canto superior direito) de cada windows/dialog. Basta que voce faça o processo que deseja no evento de FECHAR (bClose ou bEnd) da WINDOWS principal. Mas tem que ser rápido o processo porque se a aplicacao não FECHAR "naturalmente" o windows informa ao usuário se ele deseja forçar o fechamento do aplicativo.

Voce pode fazer um teste simples fazendo um programa normal que cria uma DIALOG simples e deixe ela aberta. No dialog coloque oDlg:bEnd := {||MsgStop("testando fechamento)}

Execute o seu programa e com ele aberto mande desligar o computador. Voce poderá perceber que ele vai abrir a mensagem "testando fechamento" e após algum tempo o windows vai perguntar se deseja forçar o fechamento do aplicativo.

abraço,
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

impedir desligamento do Windows pelo programa

Mensagem por cjp »

Entendi o que vc disse, pois já vi o Windows fazer isso com vários programas.

Mas não sei o que Gui ou Fivewin. Eu compilo com o Xharbour. Como faço isso?
Inacio de Carvalho Neto
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

impedir desligamento do Windows pelo programa

Mensagem por sygecom »

Tente criar uma função conforme abaixo e compile com seu sistema e teste:

Código: Selecionar todos

exit function fimSistema()
alert('aqui executa a função de saida')
return nil
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

impedir desligamento do Windows pelo programa

Mensagem por cjp »

Meu caro, acho que tem algum erro.

Essa função só funcionou quando o programa dá algum erro.

Não funciona quando o usuário aciona o desligamento do Windows, que é o que eu quero.
Inacio de Carvalho Neto
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

impedir desligamento do Windows pelo programa

Mensagem por sygecom »

Era uma tentativa, o que você quer deve ser o exemplo da pasta XHARBOUR\TEST\service.prg usando HB_SIGNAL_QUIT

Veja o exemplo que foi postado no NEWS do xHarbour:

Código: Selecionar todos

#include "hbserv.ch"
procedure main()
   cls
   fErase('Msg.txt')
   ? 'iniciou'
   HB_PushSignalHandler( HB_SIGNAL_ALL, "Handle" )
   While .t.
       a:=inkey(0)
       if lastkey()=27
          EXIT
       ENDIF
   end

   ? 'Fim normal'


 Function Handle( nSignal, aParams )
   // THIS SHOULD NOT BE DONE, but I do it to test that it works !
   // Don't do it in real life. Is not good to start threads from
   // within signal handlers.
   //StartThread(@Teller(), nSignal, aParams)

   Teller( nSignal, aParams)
   IF nSignal == HB_SIGNAL_QUIT .or. nSignal == HB_SIGNAL_INTERRUPT
      // Use only if you want to use INTERRUPT to exit prg.
      bWait = .F.
   ENDIF
RETURN HB_SERVICE_HANDLED


PROCEDURE Teller(nSignal, aParams)
   Local vArq:='.\Msg.TXT'
   //fazer o que deseja

   close all
   SET CONSOLE OFF
   SET ALTERNATE  TO &vArq
   SET ALTERNATE ON

   #ifdef HB_THREAD_SUPPORT
   ? "VM Thread    ", GetThreadId()
   ? "System Thread", GetSystemThreadId()
   #endif
   ? "Handled: ", nSignal
   ? "Syserror: ", aParams[1], aParams[2], HB_SignalDesc( aParams[1], aParams[2] )
   ?
   ? ' Finalizou o sistema ok'
   SET ALTERNATE OFF
   SET ALTERNATE TO
RETURN


Function eGrava(vTxt)
   MEMOWRIT('T.TXT',vTxt)
   ? 'Gravou'
return nil 
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Responder