Página 3 de 3

Detectar que o Windows está sendo desligado

Enviado: 08 Jun 2017 12:09
por asimoes
Se o usuário não estiver com perfil administrador acho que funciona

Detectar que o Windows está sendo desligado

Enviado: 08 Jun 2017 12:39
por asimoes
Não tem coisa pior que usuário com perfil de administrador da máquina.

Detectar que o Windows está sendo desligado

Enviado: 08 Jun 2017 13:19
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.

Detectar que o Windows está sendo desligado

Enviado: 08 Jun 2017 15:10
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.

Detectar que o Windows está sendo desligado

Enviado: 08 Jun 2017 15:18
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;
    }
}

Detectar que o Windows está sendo desligado

Enviado: 08 Jun 2017 16:04
por asimoes
Harbour tem tratamento para WM_QUERYENDSESSION só tem que ver como usar

Detectar que o Windows está sendo desligado

Enviado: 08 Jun 2017 16:16
por asimoes
Olá

Tem um exemplo usando WM_QUERYENDSESSION na Minigui

Pasta \MiniGUI\SAMPLES\Advanced\PC_SHUTDOWN função PreventSystemShutdown()