Управление завершением работы Windows

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

Предлагаем рассмотреть следующий пример:

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

unit PowerControl;

interface

uses
  Windows, Messages, SysUtils, Classes, Controls, Forms, Graphics, MMSystem;

type
  TAction = (actLogOFF, actShutDown, actReBoot, actForce,
             actPowerOFF, actForceIfHung, actMonitorOFF,
             actMonitorON, actCDEject, actCDUnEject);

  TPowerControl = class(TComponent)
  private
    FAction: TAction;
    Procedure SetAction(Value: TAction);
  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.
[Nikolaev Igor]