Окно с возможностью клика сквозь него
Окно с возможностью клика сквозь него
Некоторые улучшайзеры интерфейсов типа Actual Window Manager позволяют накладывать на окна так называемый эффект "призрачности". В этом режиме окно продолжает отображаться на экране, но все клики мышкой на области окна проходят сквозь него, как будто окна вовсе нет. Давайте разберем, как это делается. А для большего эффекта "призрачное" окно можно сделать полупрозрачным.
Эффект "призрачности" добавляется к окну двумя простыми командами. Например, на этапе создания окна:
Code (Assembler) : Убрать нумерацию
- cmp [msg],WM_INITDIALOG
- je wminitdialog
- ...
- ...
- wminitdialog:
- ; Установить режим "призрак"
- invoke SetWindowLong,[hwnddlg],GWL_EXSTYLE,WS_EX_LAYERED+WS_EX_TRANSPARENT
- ; Установить прозрачность
- invoke SetLayeredWindowAttributes,[hwnddlg],0,180,LWA_ALPHA
Первый вариант - обработка клавиатуры. Например, при нажатии на кнопку "Ctrl" окно принимает обычные свойства. В нужном месте создается отдельный поток для наблюдения за клавиатурой:
Code (Assembler) : Убрать нумерацию
- ; Запустить наблюдение за клавиатурой отдельным потоком
- xor eax,eax
- push eax
- invoke CreateThread,NULL,NULL,KeyProc,[hwnddlg],NULL,esp
- pop eax
Code (Assembler) : Убрать нумерацию
- ; Наблюдение за состоянием клавиатуры
- proc KeyProc hwnd:DWORD
- .loc_loop:
- invoke GetAsyncKeyState,VK_CONTROL
- or eax,eax
- jz @f
- ; Да, убрать режим "призрак"
- invoke GetWindowLong,[hwnd],GWL_EXSTYLE
- and eax,not WS_EX_TRANSPARENT
- invoke SetWindowLong,[hwnd],GWL_EXSTYLE,eax
- invoke SetLayeredWindowAttributes,[hwnd],0,255,LWA_ALPHA
- jmp .loc_next
- @@:
- ; Установить режим "призрак"
- invoke GetWindowLong,[hwnd],GWL_EXSTYLE
- or eax,WS_EX_TRANSPARENT
- invoke SetWindowLong,[hwnd],GWL_EXSTYLE,eax
- invoke SetLayeredWindowAttributes,[hwnd],0,180,LWA_ALPHA
- .loc_next:
- invoke Sleep,10
- jmp .loc_loop
- endp
Второй вариант - отслеживании позиции курсора. При наведении указателя на заголовок или определенную область "призрачного" окна, оно становится нормальным. Обработку можно реализовать отдельным потоком, как в предыдущем примере, а можно для разнообразия по таймеру. В сегмент данных добавляются две структуры:
Code (Assembler) : Убрать нумерацию
- ; Сегмент данных
- section '.data' data readable writeable
- pt POINT
- wr RECT
Code (Assembler) : Убрать нумерацию
- ; Установить таймер для обработчика заголовка
- invoke SetTimer,[hwnddlg],0,30,NULL
Code (Assembler) : Убрать нумерацию
- ; Получить координаты окна и курсора
- invoke GetCursorPos,pt
- invoke GetWindowRect,[hwnddlg],wr
- ; Оставить только координаты заголовка
- invoke GetSystemMetrics,SM_CYCAPTION
- add eax,[wr.top]
- mov [wr.bottom],eax
- ; Курсор находится на заголовке?
- invoke PtInRect,wr,[pt.x],[pt.y]
- or eax,eax
- jz not_on_header
- ; Да, убрать режим "призрак"
- invoke GetWindowLong,[hwnddlg],GWL_EXSTYLE
- and eax,not WS_EX_TRANSPARENT
- invoke SetWindowLong,[hwnddlg],GWL_EXSTYLE,eax
- invoke SetLayeredWindowAttributes,[hwnddlg],0,255,LWA_ALPHA
- jmp processed
- not_on_header:
- ; Установить режим "призрак"
- invoke GetWindowLong,[hwnddlg],GWL_EXSTYLE
- or eax,WS_EX_TRANSPARENT
- invoke SetWindowLong,[hwnddlg],GWL_EXSTYLE,eax
- invoke SetLayeredWindowAttributes,[hwnddlg],0,180,LWA_ALPHA
- jmp processed
Просмотров: 1649 | Комментариев: 0
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
Комментариeв нет
Добавить комментарий
Заполните форму для добавления комментария