Seu Curso

  • Increase font size
  • Default font size
  • Decrease font size

Programar em Delphi para obter o Sistema Operacional e Desligar o computador

Imprimir
Avaliação do Usuário: / 6
PiorMelhor 

Uma das boas coisas de obter-se a plataforma do sistema operacional em uso na ocasião da execução de uma aplicação é que se podem tratar sistemas operacionais diferentes de forma diferentes, por exemplo, rodar um programa no Windows XP não é necessário nada mais do que uma conta de usuário simples, já para fazer a mesma operação em um Windows Vista ou 7, dependendo o que deseja-se acessar, é preciso dos privilégios de administrador. Esse tipo de situação é muito encontrado quando há necessidade de interagir com os dispositivos do computador que são geridos pelo sistema operacional, como por exemplo, as portas serial e paralela.

Já o caso de permitir que uma aplicação feita em Delphi desligue o computador tem o objetivo de mostrar um pouco da versatilidade e poderio dessa linguagem, mas mesmo assim não é difícil encontrar utilidade para o Projeto, já que ele pode ser usado para criar aplicações de download ou upload onde ao término da transferência dos dados ou arquivos o computador deve ser desligado. Também pode ser utilizado para determinar o tempo ou horário de uso em computadores em uma Lan House.

Construindo:

1. Inicie um novo projeto;

2. No novo formulário insira um TLabel e dois TButton;
a. Para um dos botões altere a propriedade CAPTION para “Versão OS”;
b. Para o outro botão altere a propriedade CAPTION para “Desligar”;

3. Clique duas vezes no botão “Versão OS” e vamos escrever uma função logo acima da PROCEDURE criada automaticamente. Depois voltaremos para usar essa função.


function PegaVersaoWin: String;
var 
 VersionInfo : TOSVersionInfo; 
 OSName      : String; 
begin 
 VersionInfo.dwOSVersionInfoSize := SizeOf( TOSVersionInfo );
 if Windows.GetVersionEx( VersionInfo ) then 
 begin 
 with VersionInfo do 
 begin 
 case dwPlatformId of
 VER_PLATFORM_WIN32s     : OSName := 'Win32s'; 
 VER_PLATFORM_WIN32_WINDOWS : OSName := 'Windows 95';
 VER_PLATFORM_WIN32_NT      : OSName := 'Windows NT';
 VER_PLATFORM_WIN32_CE      : OSName := 'Windows CE';
 end; 
 Result := OSName + ' Versão ' + IntToStr( dwMajorVersion ) + '.' + IntToStr( dwMinorVersion ) + ' (Build ' + IntToStr( dwBuildNumber ) + ': ' + szCSDVersion + ')';
 end; 
 end 
 else 
 Result := ''; 
end;


4. Agora para a PROCEDURE do evento onClick do botão insira o seguinte código:

 

Label1.Caption := PegaVersaoWin;

 

5. Vamos inserir o código para o botão “Desligar”:


var
 hToken       : THandle;
 tkp, tkpo    : TTokenPrivileges;
 zero         : DWord;
zero := 0;
if Pos('Windows NT', PegaVersaoWin) = 1  
begin
 OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken);
 LookupPrivilegeValue( nil, 'SeShutdownPrivilege' , tkp.Privileges[ 0 ].Luid );
 tkp.PrivilegeCount := 1;
 tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
 AdjustTokenPrivileges(hToken, False, tkp, SizeOf(TTokenPrivileges), tkpo, zero);
 ExitWindowsEx(EWX_FORCE or EWX_SHUTDOWN, 0);
end
else
 ExitWindowsEx(EWX_FORCE or EWX_SHUTDOWN, 0);

 

Entendendo o código:

Para conseguir informações do sistema operacional precisamos de uma variável que seja do tipo TOSVersionInfo que é um container para todas as informações pertinentes à versão do sistema operacional.

A primeira tarefa é obter o tamanho do registro que conterá todas as informações e ajustar a propriedade dwOSVersionInfoSize, o que realizamos na seguinte linha:
VersionInfo.dwOSVersionInfoSize := SizeOf( TOSVersionInfo )

Após isso é só obter efetivamente as informações de versão do sistema operacional com Windows.GetVersionEx(VersionInfo) sendo que no objeto VersionInfo as seguintes propriedades serão preenchidas:

dwMajorVersion - número de maior significância para a versão
dwMinorVersion - número de menor significância para a versão
dwBuildNumber - número de série para a compilação
dwPlataformID - identificação da plataforma do sistema operacional

Com base nessas informações podemos inferir e tratar de forma diferente o sistema operacional onde a aplicação está sendo executada.

Já para desligar o computador a informação sobre qual plataforma está sendo utilizada é determinante, visto que para tal tarefa, em ambiente Windows NT é preciso obter privilégios específicos para a tarefa de desligar o computador.

Nas linhas abaixo abrimos acesso os registros de privilégio para o processo onde está sendo executado nosso programa (OpenProcessToken) e obtemos os privilégios atuais para esse processo (LookupPrivilegeValue), em seguida damos novo privilégio que permite que o processo possa requerer o desligamento do computador (SE_PRIVILEGE_ENABLE) atribuindo-o ao processo de nosso programa (AdjustTokenPrivileges).

OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken);
LookupPrivilegeValue( nil, 'SeShutdownPrivilege' , tkp.Privileges[ 0 ].Luid );
tkp.PrivilegeCount := 1;
tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, False, tkp, SizeOf(TTokenPrivileges), tkpo, zero);

Possuindo os privilégios necessários desligamos os computador com a linha abaixo:

ExitWindowsEx(EWX_FORCE or EWX_SHUTDOWN, 0);

Os parâmetros dessa função são o tipo de desligamento desejado e o motivo do desligamento, que será registro no log do sistema. Os tipos de desligamento são:

EWX_LOGOFF - efetua o logoff da sessão do usuário atual
EWX_POWEROFF - encerra o sistema operacional e desliga o equipamento
EWX_REBOOT - reinicia o sistema efetuando um desligamento do equipamento
EWX_RESTARTAPPS - reinicia o sistema e retorna com as aplicações que estava em execução em funcionamento
EWX_SHUTDOWN - para todos os processos, limpa todos os buffers e desliga o computador
EWX_FORCE - efetua a operação de desligamento de forma forçada

Executando:

Execute seu projeto e use o botão “Versão OS” para ver a versão do sistema operacional em Label1 e o botão “Desligar” para desligar seu computador. Lembre-se de salvar todos seus trabalhos antes de tentar executar esse projeto.


Ok, agora é só usar a imaginação!

LAST_UPDATED2  

Translation