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