Blog. Just Blog

Окно с возможностью клика сквозь него

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Образ мышления: Assembler | Автор: ManHunter
Окно с возможностью клика сквозь него
Окно с возможностью клика сквозь него

Некоторые улучшайзеры интерфейсов типа Actual Window Manager позволяют накладывать на окна так называемый эффект "призрачности". В этом режиме окно продолжает отображаться на экране, но все клики мышкой на области окна проходят сквозь него, как будто окна вовсе нет. Давайте разберем, как это делается. А для большего эффекта "призрачное" окно можно сделать полупрозрачным.

Эффект "призрачности" добавляется к окну двумя простыми командами. Например, на этапе создания окна:
  1.         cmp     [msg],WM_INITDIALOG
  2.         je      wminitdialog
  3. ...
  4. ...
  5. wminitdialog:
  6.         ; Установить режим "призрак"
  7.         invoke  SetWindowLong,[hwnddlg],GWL_EXSTYLE,WS_EX_LAYERED+WS_EX_TRANSPARENT
  8.         ; Установить прозрачность
  9.         invoke  SetLayeredWindowAttributes,[hwnddlg],0,180,LWA_ALPHA
В расширенный стиль окна добавляются два флага WS_EX_LAYERED и WS_EX_TRANSPARENT. Но так как к окну теперь добавлена "слоистость", то следующей командой обязательно надо установить коэффициент его прозрачности. Отлично, окно отображается, а все клики, как и было задумано, проходят сквозь него. Но вместе с этим появились проблемы с управлением окном. Раз окно не реагирует на нажатия, то значит не получится нажать ни на что внутри него, в том числе и на какую-нибудь кнопку выхода. Заголовок окна также попадает под это правило, поэтому кнопки закрытия окна работать не будут. Закрыть "призрачное" окно можно только через меню на панели управления. Чтобы окно вновь стало реагировать на команды, придется удалять из его расширенных стилей флаг WS_EX_TRANSPARENT, временно или постоянно - зависит от задачи. Но нужен какой-то триггер или обработчик события.

Первый вариант - обработка клавиатуры. Например, при нажатии на кнопку "Ctrl" окно принимает обычные свойства. В нужном месте создается отдельный поток для наблюдения за клавиатурой:
  1.         ; Запустить наблюдение за клавиатурой отдельным потоком
  2.         xor     eax,eax
  3.         push    eax
  4.         invoke  CreateThread,NULL,NULL,KeyProc,[hwnddlg],NULL,esp
  5.         pop     eax
В функции-обработчике в цикле проверяется состояние клавиши "Ctrl", если она нажата, то с окна снимается режим "призрак" и прозрачность, если не нажата, то окно становится "призрачным" и полупрозрачным.
  1. ; Наблюдение за состоянием клавиатуры
  2. proc KeyProc hwnd:DWORD
  3.  
  4. .loc_loop:
  5.         invoke  GetAsyncKeyState,VK_CONTROL
  6.         or      eax,eax
  7.         jz      @f
  8.  
  9.         ; Да, убрать режим "призрак"
  10.         invoke  GetWindowLong,[hwnd],GWL_EXSTYLE
  11.         and     eax,not WS_EX_TRANSPARENT
  12.         invoke  SetWindowLong,[hwnd],GWL_EXSTYLE,eax
  13.         invoke  SetLayeredWindowAttributes,[hwnd],0,255,LWA_ALPHA
  14.         jmp     .loc_next
  15. @@:
  16.         ; Установить режим "призрак"
  17.         invoke  GetWindowLong,[hwnd],GWL_EXSTYLE
  18.         or      eax,WS_EX_TRANSPARENT
  19.         invoke  SetWindowLong,[hwnd],GWL_EXSTYLE,eax
  20.         invoke  SetLayeredWindowAttributes,[hwnd],0,180,LWA_ALPHA
  21. .loc_next:
  22.         invoke  Sleep,10
  23.         jmp     .loc_loop
  24. endp
Естественно, клавиша может быть любой, это даже может быть комбинация клавиш или особая последовательность. Да и "призрачность" в таком случае можно снимать не временно, а также до наступления определенного события.

Второй вариант - отслеживании позиции курсора. При наведении указателя на заголовок или определенную область "призрачного" окна, оно становится нормальным. Обработку можно реализовать отдельным потоком, как в предыдущем примере, а можно для разнообразия по таймеру. В сегмент данных добавляются две структуры:
  1. ; Сегмент данных
  2. section '.data' data readable writeable
  3.  
  4. pt   POINT
  5. wr   RECT
При инициализации окна устанавливается таймер с очень малым интервалом, чтобы максимально быстро реагировать на перемещение курсора.
  1.         ; Установить таймер для обработчика заголовка
  2.         invoke  SetTimer,[hwnddlg],0,30,NULL
По сообщению WM_TIMER программа получает текущие координаты курсора и прямоугольник с координатами углов обрабатываемого окна. Если курсор находится в заголовке окна, то режим "призрак" снимается, в противном случае окно делается прозрачным.
  1.         ; Получить координаты окна и курсора
  2.         invoke  GetCursorPos,pt
  3.         invoke  GetWindowRect,[hwnddlg],wr
  4.         ; Оставить только координаты заголовка
  5.         invoke  GetSystemMetrics,SM_CYCAPTION
  6.         add     eax,[wr.top]
  7.         mov     [wr.bottom],eax
  8.  
  9.         ; Курсор находится на заголовке?
  10.         invoke  PtInRect,wr,[pt.x],[pt.y]
  11.         or      eax,eax
  12.         jz      not_on_header
  13.  
  14.         ; Да, убрать режим "призрак"
  15.         invoke  GetWindowLong,[hwnddlg],GWL_EXSTYLE
  16.         and     eax,not WS_EX_TRANSPARENT
  17.         invoke  SetWindowLong,[hwnddlg],GWL_EXSTYLE,eax
  18.         invoke  SetLayeredWindowAttributes,[hwnddlg],0,255,LWA_ALPHA
  19.         jmp     processed
  20.  
  21. not_on_header:
  22.         ; Установить режим "призрак"
  23.         invoke  GetWindowLong,[hwnddlg],GWL_EXSTYLE
  24.         or      eax,WS_EX_TRANSPARENT
  25.         invoke  SetWindowLong,[hwnddlg],GWL_EXSTYLE,eax
  26.         invoke  SetLayeredWindowAttributes,[hwnddlg],0,180,LWA_ALPHA
  27.         jmp     processed
В приложении примеры программ с исходными текстами, создающие "призрачные" окна. Обработка событий выполняется с клавиатуры или по движению курсора.

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

Ghost.Window.Demo.zip (4,554 bytes)


Поделиться ссылкой ВКонтакте Поделиться ссылкой на Facebook Поделиться ссылкой на LiveJournal Поделиться ссылкой в Мой Круг Добавить в Мой мир Добавить на ЛиРу (Liveinternet) Добавить в закладки Memori Добавить в закладки Google
Просмотров: 727 | Комментариев: 0

Метки: Assembler, окна

Комментарии

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

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

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

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