1. Набираем команду codeby webinar. Набираем команду для организации и проведения вебинаров. Подробнее ...

    Скрыть объявление
  2. Требуются разработчики и тестеры для проекта codebyOS. Требования для участия в проекте: Знание принципов работы ОС на базе Linux; Знание Bash; Крайне желательное знание CPP, Python, Lua; Навыки системного администрирования. Подробнее ...

    Скрыть объявление
  3. Получи 30.000 рублей. Для получения денег необходимо принять участие в конкурсе авторов codeby. С условиями и призами можно ознакомиться на этой странице ...

    Внимание! Регистрация авторов на конкурс закрыта.

    Скрыть объявление

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

Тема в разделе "Delphi - программирование", создана пользователем Slava9371, 14 май 2012.

  1. Slava9371

    Slava9371 Гость

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

    Код:
    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;
    Предотвращать или запрещать показ заставки мне не нужно, надо только что-бы программа узнала о запуске заставки.

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

    Slava9371 Гость

    Репутация:
    0
    Неужели ни кто не сталкивался с такой проблемой?
     
  3. Slava9371

    Slava9371 Гость

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

    Код:
    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;
    Тема закрыта!
     
Загрузка...

Поделиться этой страницей