Detectar que o Windows está sendo desligado

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

Moderador: Moderadores

Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Detectar que o Windows está sendo desligado

Mensagem por asimoes »

Se o usuário não estiver com perfil administrador acho que funciona
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Detectar que o Windows está sendo desligado

Mensagem por asimoes »

Não tem coisa pior que usuário com perfil de administrador da máquina.
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Detectar que o Windows está sendo desligado

Mensagem por JoséQuintas »

Convém lembrar de uma coisa:

Se impedir o usuário de desligar, ele vai desligar no POWER, achando que travou tudo.

Se no acesso remoto pelo menos estiver configurado pra emitir som do lado do host, e for Windows 10 ou equivalente, poderia emitir uma mensagem "favor não desligar" a cada intervalo de tempo.
Correndo o risco de desligarem pra não ouvir a mensagem... rs

Isso é complicado.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
acelconsultoria
Usuário Nível 3
Usuário Nível 3
Mensagens: 231
Registrado em: 10 Jan 2006 17:05
Localização: Itápolis-SP

Detectar que o Windows está sendo desligado

Mensagem por acelconsultoria »

Encontrei esses códigos em Delphi, mencionando sobre a WMQueryEndSession ... tem algo similar no Harbour ou alguém que entenda de Deplhi consiga "traduzir" ?

Código: Selecionar todos

{Esta dica ensina como interromper o processo de desligamento do Windows. Com esta dica você poderá evitar que desliguem o Windows enquanto a sua aplicação estiver aberta e correr o risco de perder ou corromper dados. O código abaixo mostra como fazer isto.}

 
private
   { Private declarations }
   procedure WMQueryEndSession (var Msg : TWMQueryEndSession); message WM_QueryEndSession;

public
   { Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.WMQueryEndSession (var Msg : TWMQueryEndSession);
begin
    if MessageDlg('O Windows deseja desligar agora, Permitir ?', mtConfirmation, [mbYes,mbNo], 0) = mrNo then
        Msg.Result := 0
    else
        Msg.Result := 1;
end;

{A Msg "WM_QUERYENDSESSION" é enviada para todas as aplicações que estão "abertas" quando o usuário clica em uma das opções "desligar" do windows ou quando uma aplicação chama a função "ExitWindows". Se qualquer aplicação retornar zero, o Windows não se fechará e sistema irá parar de enviar as Msg "WM_QUERYENDSESSION". 
    Após ter processado esta Msg, o sistema envia a mensagem "WM_ENDSESSION" junto do parâmetro "wParam" com os resultados da mensagem de "WM_QUERYENDSESSION". Finalizando ou não o Windows.}
Como o Quintas disse, não dá pra interromper eventos mais "brutos", como queda de energia sem nobreak, desligamento forçado tirando da tomada, ou quando o usuário sai no soco com a máquina. huahahahahaha.... Mas quando o desligamento comum é feito, o Windows dispara um evento... e é nesse evento que a coisa tem que ser trabalhada. Ah, e claro, se puder deixar uma mensagem pro usuário entender que a máquina não está travada, e sim realizando um processo, melhor ainda.
Adm. Maickon Sato
Consultoria e Projetos
-------------------------------------------------------
Avatar do usuário
acelconsultoria
Usuário Nível 3
Usuário Nível 3
Mensagens: 231
Registrado em: 10 Jan 2006 17:05
Localização: Itápolis-SP

Detectar que o Windows está sendo desligado

Mensagem por acelconsultoria »

Na API do Windows, tem isso aqui:

https://msdn.microsoft.com/pt-br/librar ... 83(v=vs.85).aspx

A coisa está no "ShutdownBlockReasonCreate"

Exemplo em C++

Código: Selecionar todos

#include <Windows.h>
#include <iostream>
std::wstring s2ws(const std::string& s)
{
    int len;
    int slength = (int)s.length() + 1;
    len = MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, 0, 0); 
    wchar_t* buf = new wchar_t[len];
    MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, buf, len);
    std::wstring r(buf);
    delete[] buf;
    return r;
}

int main(int argc, char* argv[])
{
    if (ShutdownBlockReasonCreate(GetForegroundWindow(), s2ws("TEST").c_str()) != 0)
        std::cout << "Success" << std::endl;
    else
        std::cout << "Failure" << std::endl;

    while (1) 
    {
        Sleep(1000);
        std::cout << "Testing..." << std::endl;
    }
}
Adm. Maickon Sato
Consultoria e Projetos
-------------------------------------------------------
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Detectar que o Windows está sendo desligado

Mensagem por asimoes »

Harbour tem tratamento para WM_QUERYENDSESSION só tem que ver como usar
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Detectar que o Windows está sendo desligado

Mensagem por asimoes »

Olá

Tem um exemplo usando WM_QUERYENDSESSION na Minigui

Pasta \MiniGUI\SAMPLES\Advanced\PC_SHUTDOWN função PreventSystemShutdown()
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Responder