Перехват Заставки

  • Автор темы Slava9371
  • Дата начала
S

Slava9371

Гость
#1
Добрый вечер.
Возникла задача перехватить появление экранной заставки.
Нашел код:

Код:
procedure TForm1.ProcessMess(var msg: TMsg; var handled: boolean);
begin
if (msg.message=WM_SYSCOMMAND) and
(msg.wParam=SC_SCREENSAVE) then
handled:=true
else
handled:=false;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnMessage:=ProcessMess;
end;
но он не совсм подходит так как:
Windows посылает такое сообщение только текущему (top-level)
приложению.
И это можно решить с помощью SetWindowsHookEx()

Но в тоже время спокойно перехватил переход в спящий режим: вот таким кодом:

Код:
procedure WMPowerBroadcast( var Message: TMessage); message WM_POWERBROADCAST;

procedure TForm1.WMPowerBroadcast(var Message: TMessage);
begin
ShowMessage('Sleep')
end;
Предотвращать или запрещать показ заставки мне не нужно, надо только что-бы программа узнала о запуске заставки.

Вопрос: подскажите какой нибудь способ перехвата заставки, и можно ли обойтись без использования ловушки?
Заранее спасибо...
 
S

Slava9371

Гость
#2
Неужели ни кто не сталкивался с такой проблемой?
 
S

Slava9371

Гость
#3
Разобрался!
Проблему решил таким вот на мой взгляд шаманским) способом:

Код:
var
ScreenSaverActive: Bool;
Check : byte;

procedure TForm1.FormCreate(Sender: TObject);
begin
ScreenSaverActive := False;
Check := 0;
end;

procedure TForm1.Timer1Timer(Sender: TObject);

begin
SystemParametersInfo(SPI_GETSCREENSAVERRUNNING, 0, @ScreenSaverActive, 0);
if (Check = 0) and (ScreenSaverActive = true) then begin
Check := 1; 
//если заставка запущенна
end;
if (Check = 1) and (ScreenSaverActive = False) then begin
Check := 2; 
//если заставка отключается
end
end;
Тема закрыта!