Blog. Just Blog

Моргание окна на Ассемблере

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Образ мышления: Assembler | Автор: ManHunter
Наверняка вы не раз сталкивались с тем, что приложение, которое свернуто или работает в фоновом режиме, но хочет привлечь внимание пользователя, использует эффект моргания окна. Это может быть оповещение об окончании длительного процесса или просто информация для пользователя, с которой ему надо как можно быстрее ознакомиться. И действительно, такой способ работает. В этой статье я вам расскажу, как такой эффект реализуется.

Самый простой способ моргнуть окном - использовать стандартную функцию FlashWindow. Для ее использования нужно только знать хэндл окна, которое должно моргнуть, вот и все. Это не обязательно должно быть окно именно вашего приложения, вы можете легко моргать любым окном, доступным в системе. Вызов простейший:
  1.         ; hwnd - хэндл окна, которое должно моргнуть
  2.         invoke  FlashWindow,[hwnd],FALSE
В качестве бонуса она возвращает статус окна, к которому была применена: нулевое значение, если окно не было активным, и ненулевое значение, если было. Это полезно, например, в том случае, когда надо продолжать привлекать внимание пользователя до тех пор, пока он не активирует нужное окно. Недостаток функции FlashWindow в том, что параметры моргания зависят от системы, мы со своей стороны никак на них повлиять не можем. Точнее можем, через функцию SystemParametersInfo с параметром SPI_SETFOREGROUNDFLASHCOUNT, но такие изменения затронут все приложения, что не есть хорошо.

Если требуется иметь полный контроль над параметрами моргания, то надо использовать более продвинутую функцию FlashWindowEx. Но сперва придется самостоятельно описать используемые структуры и константы, так как FASM в стандартной комплектации их не знает.
  1. ; Описание структуры для моргания окна
  2. struct FLASHWINFO
  3.   cbSize    dd ?
  4.   hwnd      dd ?
  5.   dwFlags   dd ?
  6.   uCount    dd ?
  7.   dwTimeout dd ?
  8. ends
  9.  
  10. ; Флаги режимов моргания окна
  11. FLASHW_CAPTION = 0x00000001
  12. FLASHW_TRAY    = 0x00000002
  13. FLASHW_ALL     = 0x00000003
  14.  
  15. flash       FLASHWINFO ; Структура для моргания окна
Перед вызовом функции в структуре FLASHWINFO заполняются все необходимые параметры: хэндл окна, режим моргания (только заголовок окна, только кнопка окна на панели задач или все сразу), количество морганий и частота.
  1.         ; Заполнить структуру FLASHWINFO
  2.         mov     [flash.cbSize],sizeof.FLASHWINFO
  3.         ; Хэндл окна, которое должно моргнуть
  4.         mov     ecx,[hwnd]
  5.         mov     [flash.hwnd],ecx
  6.         ; Режим моргания - заголовок и кнопка окна в панели задач
  7.         mov     [flash.dwFlags],FLASHW_ALL
  8.         ; Количество морганий, в моем примере 10 итераций
  9.         mov     [flash.uCount],10
  10.         ; Частота морганий
  11.         mov     [flash.dwTimeout],80
  12.         ; Вызвать функцию 
  13.         invoke  FlashWindowEx,flash
Возвращаемое значение такое же, как и в случае с FlashWindow. Во время работы функций FlashWindow и FlashWindowEx все повторные вызовы моргания будут игнорироваться.

В приложении пример программы с исходным текстом, демонстрирующей моргание окна приложения каждым из описанных в статье способом.

Пример программы с исходным текстом (FASM)Пример программы с исходным текстом (FASM)

Flash.Window.Demo.zip (2,365 bytes)


Поделиться ссылкой ВКонтакте
Просмотров: 1610 | Комментариев: 0

Метки: Assembler, окна
Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
Комментариeв нет

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.09 сек. / MySQL: 2 (0.0076 сек.) / Память: 4.5 Mb
Наверх