Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

Компонент PowerControl

01.01.2007

Вопрос: А как реализовать в одном компоненте такие функции как выключение компьютера, перезагрузка, завершение сеанса работы пользователя, Eject CD, выключение питания монитора и т.д.? Ответ: предлагаем посмотреть следующий пример ...

procedure TForm1.Button1Click(Sender: TObject); 
begin 
  PowerControl1.Action:=actCDEject;// Или... actLogOFF, actShutDown... 
  PowerControl1.Execute; 
end; 

Component Code:

unit PowerControl; 
 
interface 
 
uses WinTypes, WinProcs, Messages, SysUtils, Classes, Controls, 
     Forms, Graphics, MMSystem; 
 
type 
   TAction = (actLogOFF,actShutDown,actReBoot,actForce,actPowerOFF, 
actForceIfHung,actMonitorOFF,actMonitorON,actCDEject,actCDUnEject); 
 
type 
  TPowerControl = class(TComponent) 
    private 
        FAction : TAction; 
        procedure SetAction(Value : TAction); 
    protected 
    public 
        function Execute : Boolean; 
    published 
        property Action : TAction read FAction write SetAction; 
  end; 
 
procedure Register; 
 
implementation 
 
procedure Register; 
begin 
     RegisterComponents('K2', [TPowerControl]); 
end; 
 
procedure TPowerControl.SetAction(Value : TAction); 
begin 
     FAction := Value; 
end; 
 
function TPowerControl.Execute : Boolean; 
begin 
    with (Owner as TForm) do 
       case FAction of 
         actLogOff: ExitWindowsEx(EWX_LOGOFF,1); 
         actShutDown: ExitWindowsEx(EWX_SHUTDOWN,1); 
         actReBoot: ExitWindowsEx(EWX_REBOOT,1); 
         actForce: ExitWindowsEx(EWX_FORCE,1); 
         actPowerOff: ExitWindowsEx(EWX_POWEROFF,1); 
         actForceIfHung: ExitWindowsEx(EWX_FORCEIFHUNG,1); 
         actMonitorOFF: SendMessage(Application.Handle, 
                        WM_SYSCOMMAND, SC_MONITORPOWER, 0); 
         actMonitorON: SendMessage(Application.Handle, WM_SYSCOMMAND, 
                       SC_MONITORPOWER, -1); 
         actCDEject: mciSendstring('SET CDAUDIO DOOR OPEN 
                     WAIT',nil,0, Handle); 
         actCDUnEject: mciSendstring('SET CDAUDIO DOOR CLOSED 
                       WAIT',nil,0, Handle); 
       end; {Case} 
    Result := True; 
end; 
 
end.

Взято из https://forum.sources.ru