{--------------------------------------------------------}
{
{    Ajuda para desligar o Windows
{    Autor: José Antonio Borges
{    Em 3/6/99
{
{--------------------------------------------------------}

{$M 16536,8192}
program fechaWindows;
uses dvcrt, dvWin, dvMacro, winprocs, wintypes;

const
    tituloProg = 'DOSVOX - Saída do sistema';

{--------------------------------------------------------}

procedure mensagem (nomeArq: string; nlf: integer);
var i: integer;
    s: string;
begin
    if nomeArq = 'FWQUALOP' then
        s := 'Qual a opção de saída:'
    else
    if nomeArq = 'FWOPCOES' then
        s := 'D - Desligar, M - MS-DOS, W - Windows ou R - Reiniciar o computador?  '
    else
    if nomeArq = 'FWDEIXAM' then
        s := 'Deixa monitor de janelas ativo ? '
    else
    if nomeArq = 'FWDESCON' then
        s := 'Desconectando, aguarde 15 segundos.'
    else
    if nomeArq = 'FWERRFEC' then
        s := 'Algum programa não pode ser automaticamente encerrado.'
    else
    if nomeArq = 'FWWINATV' then
        s := 'Windows continua ativo.'
    else
        s := '--> Mensagem invalida: ' + nomeArq;

    write (s);
    for i := 1 to nlf do
         writeln;

    if existeArqSom (nomeArq) then
        sintSom (nomearq)
    else
        sintetiza (s);
end;

{--------------------------------------------------------}

const
    DESLIGAR    = 'D';
    REINICIAR   = 'R';
    SAIRMSDOS   = 'M';
    SAIRWINDOWS = ' ';

procedure terminaWindows (opcao: char);
var teclaMenuDesligar, teclaOpcao: char;
    s: string;
    y: integer;
begin
    mensagem ('FWDESCON', 1);  {'Desconectando, espere 15 segundos.'}
    while sintfalando do;

    s := sintAmbiente ('HOOKUTIL', 'MENUDESLIGAR');
    if s <> '' then   teclaMenuDesligar := s[1]
               else   teclaMenuDesligar := 'R';

    if opcao = DESLIGAR then
        begin
            s := sintAmbiente ('HOOKUTIL', 'OPCAODESLIGAR');
            if s <> '' then   teclaOpcao := s[1]
            else              teclaOpcao := 'D';
        end
    else
    if opcao = SAIRMSDOS then
        begin
            s := sintAmbiente ('HOOKUTIL', 'OPCAOMSDOS');
            if s <> '' then   teclaOpcao := s[1]
            else              teclaOpcao := 'M';
        end
    else
    if opcao = REINICIAR then
        begin
            s := sintAmbiente ('HOOKUTIL', 'OPCAOREINICIAR');
            if s <> '' then   teclaOpcao := s[1]
            else              teclaOpcao := 'R';
        end;

    y := getSystemMetrics (SM_CYSCREEN) -1;
    mouseClick (20, y);    {aciona menu iniciar}
    delay (200);
    mouseClick (20, y-20);
    delay (200);

    keyboardClick (teclaMenuDesligar);
    delay (500);
    keyboardClick (teclaOpcao);
    delay (200);
    keyboardClick (ENTER);

    delay (15000);

    mensagem ('FWERRFEC', 1);    {'Algum programa não pode ser automaticamente encerrado'}
    mensagem ('FWWINATV', 1);    {'Windows continua ativo'}
    while sintFalando do;
    sintFim;

    delay (2000);
    doneWinCrt;
end;

{--------------------------------------------------------}

procedure cancelaMonitor;
var janMonitor, janAtual: hWnd;
    monitorAtivo: boolean;
begin
    janMonitor := findWindow (NIL, 'MONITVOX');
    monitorAtivo := janMonitor <> 0;
    janAtual := getActiveWindow;

    if monitorAtivo then
        begin
            showWindow (janMonitor, sw_maximize);
            playInit (30);
            playVirtKey (VK_F4, false, false, true, 1);
            playStart;
            while  playIsActive do;
        end;

    delay (500);
    setActiveWindow (janAtual);
    delay (500);
end;

{--------------------------------------------------------}

var c, c2: char; atributo: string;
label deNovo;
begin

    calaBoca;

    screenSize.y := 4;
    clrscr;
    setWindowText (crtWindow, tituloProg);

    sintInic (0, sintAmbiente('HOOKUTIL','DIRHOOKUTIL'));
    delay (200);   { para evitar problemas com clik }

deNovo:
    clrscr;

    atributo := '';
    if paramCount >= 1 then
    begin
        atributo := paramStr(1);
        if (atributo = 'd') or (atributo = 'D') then terminaWindows (DESLIGAR);
        if (atributo = 'r') or (atributo = 'R') then terminaWindows (REINICIAR);
        if (atributo = 'm') or (atributo = 'M') then terminaWindows (SAIRMSDOS);
    end;

    mensagem ('FWQUALOP', 1);    {'Qual a opção de saída:'}
    mensagem ('FWOPCOES', 0);    {'D - Desligar, M - MS-DOS, W - Windows ou R - Reiniciar o computador?  '}

    sintLeTecla (c, c2);
    writeln;
    case upcase(c) of
        'D':  terminaWindows (DESLIGAR);
        'R':  terminaWindows (REINICIAR);
        'M':  terminaWindows (SAIRMSDOS);
        'W':  begin
                  if findWindow (NIL, 'MONITVOX') <> 0 then
                      begin
                          mensagem ('FWDEIXAM', 0);    {'Deixa monitor ativo ?'}
                          sintLeTecla (c, c2);
                          writeln;
                          if upcase(c) <> 'S' then  cancelaMonitor;
                      end;
              end;
    else
        goto deNovo;
    end;

    mensagem ('FWWINATV', 1);    {'Windows continua ativo'}
    sintFim;
    doneWinCrt;
end.
