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: 20420
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

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, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (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