Александр Чиртик

Программирование в Delphi. Трюки и эффекты


Скачать книгу

табл. 1.1 приведено описание полей структуры FLASHWINFO.

Таблица 1.1. Поля структуры FLASHWINFO

      Значение параметра dwFlags формируется из приведенных ниже флагов с использованием операции побитового ИЛИ:

      • FLASHW_CAPTION – инвертирует состояние заголовка окна;

      • FLASHW_TRAY – заставляет мигать кнопку на Панели задач;

      • FLASHW_ALL – сочетание FLASHW_CAPTION и FLASHW_TRAY;

      • FLASHW_TIMER – периодически измененяет состояния заголовка окна и/или кнопки на Панели задач до того момента, пока функция FlashWindowEx не будет вызвана с флагом FLASHW_STOP;

      • FLASHW_TIMERNOFG – периодически измененяет состояния заголовка окна и/или кнопки на Панели задач до тех пор, пока окно не станет активным;

      • FLASHW_STOP – восстанавливает исходное состояние окна и кнопки на Панели задач.

      Далее приведены два примера использования функции FlashWindowEx.

      В первом примере состояние заголовка окна и кнопки на Панели задач изменяется десять раз в течение двух секунд (листинг 1.2).

Листинг 1.2. Десятикратная инверсия заголовка окна

      procedure TForm1.cmbInverse10TimesClick(Sender: TObject);

      var

      fl: FLASHWINFO;

      begin

      fl.cbSize:= SizeOf(fl);

      fl.hwnd:= Handle;

      fl.dwFlags:= FLASHW_CAPTION or FLASHW_TRAY; //аналогично FLASHW_ALL

      fl.uCount:= 10;

      fl.dwTimeout:= 200;

      FlashWindowEx(fl);

      end;

      Второй пример демонстрирует использование флагов FLASHW_TIMER и FLASHW_ STOP для инверсии заголовка окна в течение заданного промежутка времени (листинг 1.3).

Листинг 1.3. Инверсия заголовка окна в течение определенного промежутка времени

      //Запуск процесса периодической инверсии заголовка

      procedure TForm1.cmbFlashFor4SecClick(Sender: TObject);

      var

      fl: FLASHWINFO;

      begin

      fl.cbSize:= SizeOf(fl);

      fl.hwnd:= Handle;

      fl.dwTimeout:= 200;

      fl.dwFlags:= FLASHW_ALL or FLASHW_TIMER;

      fl.uCount:= 0;

      FlashWindowEx(fl);

      Timer1.Enabled:= True;

      end;

      //Остановка инверсии и заголовка

      procedure TForm1.Timer1Timer(Sender: TObject);

      var

      fl: FLASHWINFO;

      begin

      fl.cbSize:= SizeOf(fl);

      fl.hwnd:= Handle;

      fl.dwFlags:= FLASHW_STOP;

      FlashWindowEx(fl);

      Timer1.Enabled:= False;

      end;

      В данном примере используется таймер, срабатывающий каждые четыре секунды. Таймер первоначально неактивен. Конечно, можно было бы не использовать его, а просто посчитать количество инверсий, совершаемых в течение требуемого интервала времени (в данном случае четырех секунд) и задать его в поле uCount. Но приведенный пример предназначен именно для демонстрации использования флагов FLASHW_TIMER и FLASHW_STOP.

      Активизация окна

      Теперь рассмотрим другой, гораздо более гибкий способ привлечения внимания к окну приложения. Он базируется на использовании API-функции SetForegroundWindow. Данная функция принимает один единственный параметр – дескриптор окна. Если выполняется ряд условий, то окно в заданным дескриптором будет выведено на передний план, и пользовательский ввод будет направлен в это окно. Функция возвращает нулевое значение, если не удалось сделать окно активным.

      В приведенном ниже примере окно активизируется при каждом срабатывании таймера (листинг 1.4).

Листинг 1.4. Активизация окна

      procedure TForm1.Timer1Timer(Sender: TObject);

      begin

      SetForegroundWindow(Handle);

      end;

      В