Detectar que o Windows está sendo desligado
Moderador: Moderadores
Detectar que o Windows está sendo desligado
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)
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)
Detectar que o Windows está sendo desligado
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)
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)
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Detectar que o Windows está sendo desligado
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.
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/
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/
- acelconsultoria
- 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
Encontrei esses códigos em Delphi, mencionando sobre a WMQueryEndSession ... tem algo similar no Harbour ou alguém que entenda de Deplhi consiga "traduzir" ?
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.
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.}
Adm. Maickon Sato
Consultoria e Projetos
-------------------------------------------------------
Consultoria e Projetos
-------------------------------------------------------
- acelconsultoria
- 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
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++
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
-------------------------------------------------------
Consultoria e Projetos
-------------------------------------------------------
Detectar que o Windows está sendo desligado
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)
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)
Detectar que o Windows está sendo desligado
Olá
Tem um exemplo usando WM_QUERYENDSESSION na Minigui
Pasta \MiniGUI\SAMPLES\Advanced\PC_SHUTDOWN função PreventSystemShutdown()
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)
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)
