본문 바로가기
Delphi Tip/+Tip

시스템 대기모드/화면 보호기/모니터 끄기 이벤트 감지하기

by MonoSoft 2022. 2. 17.
728x90
반응형

시스템 대기모드/화면 보호기/모니터 끄기 이벤트 감지하기

 

unit Unit1;

 

interface

 

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, StdCtrls, Registry, Inifiles;

 

type

  TForm1 = class(TForm)

    Memo1: TMemo;

  private

    { Private declarations }

  public

    { Public declarations }

    procedure WMSyscommandBroadcast(var Msg: TMessage); message WM_SYSCOMMAND;

    procedure WMPowerBroadcast(var Msg: TMessage); message WM_POWERBROADCAST;

  end;

 

var

  Form1: TForm1;

 

implementation

 

{$R *.dfm}

 

procedure TForm1.WMSyscommandBroadcast(var Msg: TMessage);

var

  SSStr: String;

begin

  if (Msg.wParam and $FFF0) = SC_SCREENSAVE then // 화면 보호기 시작

  begin

    with TRegistry.Create do

    begin

      RootKey := HKEY_CURRENT_USER;

      OpenKey('Control Panel\Desktop',False);

      SSStr := ReadString('SCRNSAVE.EXE'); // Windows NT 기반

      Free;

    end;

 

    if not FileExists(SSStr) then

    begin

      with TIniFile.Create('system.ini') do

      begin

        SSStr := ReadString('boot','SCRNSAVE.EXE',''); // Windows 98

        Free;

      end;

    end;

 

    // 사용자가 윈도우즈에서 화면 보호기를 껐다

    // Windows2000은 화면보호기를 사용자가 꺼도 이벤트가 발생하므로 프로그램에서도 화면보호기를 꺼야함

    if FileExists(SSStr) then

      Memo1.Lines.Add('SC_SCREENSAVE: 화면 꺼짐')

    else

      SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, ord(FALSE), nil, SPIF_SENDCHANGE); // 화면보호기 OFF

    Msg.Result := Integer(True);

  end

  else

  if ((Msg.wParam and $FFF0) = SC_MONITORPOWER) and

      (Msg.lParam = 2) then // 모니터 꺼짐 (2=turn off the monitor)

  begin

    Memo1.Lines.Add('SC_MONITORPOWER: 화면 꺼짐');

    Msg.Result := Integer(False);

  end;

  inherited;

end;

 

procedure TForm1.WMPowerBroadcast(var Msg: TMessage);

const

  PBT_APMQUERYSUSPEND        = $0000;

  PBT_APMQUERYSTANDBY        = $0001;

  PBT_APMQUERYSUSPENDFAILED  = $0002;

  PBT_APMQUERYSTANDBYFAILED  = $0003;

  PBT_APMSUSPEND             = $0004;

  PBT_APMSTANDBY             = $0005;

  PBT_APMRESUMECRITICAL      = $0006;

  PBT_APMRESUMESUSPEND       = $0007;

  PBT_APMRESUMESTANDBY       = $0008;

  PBTF_APMRESUMEFROMFAILURE  = $00000001;

  PBT_APMBATTERYLOW          = $0009;

  PBT_APMPOWERSTATUSCHANGE   = $000A;

  PBT_APMOEMEVENT            = $000B;

begin

  if Msg.wParam = PBT_APMSUSPEND then // 시스템 대기모드 시작

  begin

    Memo1.Lines.Add('PBT_APMSUSPEND: 대기모드 시작');

    Msg.Result := Integer(True);

  end

  else

  if Msg.wParam = PBT_APMRESUMESUSPEND then // 시스템 대기모드 복귀

  begin

    Memo1.Lines.Add('PBT_APMRESUMESUSPEND: 대기모드 끝');

    Msg.Result := Integer(True);

  end;

  inherited;

end;

end.

 

728x90
반응형

댓글