Programar em Delphi para obter o Sistema Operacional e Desligar o computador - Seu Curso
Programar em Delphi para obter o Sistema Operacional e Desligar o computador
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.
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;
OSName : String;
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';
Result := OSName + ' Versão ' + IntToStr( dwMajorVersion ) + '.' + IntToStr( dwMinorVersion ) + ' (Build ' + IntToStr( dwBuildNumber ) + ': ' + szCSDVersion + ')';
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":
tkp, tkpo : TTokenPrivileges;
zero : DWord;
if Pos('Windows NT', PegaVersaoWin) = 1
OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken);
LookupPrivilegeValue( nil, 'SeShutdownPrivilege' , tkp.Privileges[ 0 ].Luid );
AdjustTokenPrivileges(hToken, False, tkp, SizeOf(TTokenPrivileges), tkpo, zero);
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).
Possuindo os privilégios necessários desligamos os computador com a linha abaixo:
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
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.