Delphi. Трюки и эффекты. Александр Чиртик. Читать онлайн. Newlib. NEWLIB.NET

Автор: Александр Чиртик
Издательство:
Серия:
Жанр произведения: Программы
Год издания: 0
isbn: 978-5-911-80219-6
Скачать книгу
– периодическое изменение состояния заголовка окна и/или кнопки на Панели задач вплоть до того момента, пока фyнкцияFlashWindowEx не будет вызвана с флагом FLASHW_STOP;

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

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

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

      В первом – состояние заголовка окна и кнопки на Панели задач изменяется десять раз каждые 0,2 секунды (листинг 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;

      Второй пример демонстрирует использование флаговРЬАЗШ_Т1МЕРч и 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_TIMERH flashw_stop.

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

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

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

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

      procedure TForm1.Timer1Timer(Sender: TObject);

      begin

      SetForegroundWindow(Handle);

      end;

      В операционных системах старше Windows 95 и Windows NT 4.0 введен ряд ограничений на действие функции SetForegroundWindow. Так, приведенный выше пример как раз и является одним из случаев недружественного использования активизации окна, но это всего лишь пример.

      Чтобы активизировать окно, процесс должен быть не фоновым либо должен иметь право устанавливать активное окно, назначенное ему другим процессом с таким