시스템 대기모드/화면 보호기/모니터 끄기 이벤트 감지하기
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.
'Delphi Tip > +Tip' 카테고리의 다른 글
윈도우 포커스 및 최상위로 올리기/활성화 (0) | 2022.02.23 |
---|---|
외부 프로그램 실행하고 대기하기 (0) | 2022.02.22 |
문자열에서 특정 문자까지 자르기 (0) | 2022.02.16 |
델파이 로고(logo) 관리 (0) | 2022.02.15 |
스크롤박스의 스크롤 제어 방법 (0) | 2022.02.14 |
댓글