Blog. Just Blog

Быстрый поиск

Введите фрагмент названия статьи для поиска

Магнитное окно с учетом нескольких мониторов

04.06.2018 | Категория: Образ мышления: Assembler | Автор: ManHunter
Продолжаем работу над ошибками. Несколько лет назад в одной из статей я рассказывал, как сделать окно, которое при перемещении будет прилипать ко краям экрана. Этот способ рабочий, но он не учитывает ситуацию, когда у пользователя более одного монитора. Дело в том, что функция SystemParametersInfo с параметром SPI_GETWORKAREA возвращает координаты рабочей области только основного монитора. Для поддержки нескольких мониторов, в том числе произвольных размеров, надо сперва определить, на каком мониторе находится окно. Затем надо будет получить характеристики этого монитора, точнее координаты его рабочей области. Но сперва придется определить структуру и константу, про которую не знает коробочный FASM.
  1. MONITOR_DEFAULTTONEAREST = 2
  2.  
  3. struct MONITORINFO
  4.     cbSize    dd ?
  5.     rcMonitor RECT
  6.     rcWork    RECT
  7.     dwFlags   dd ?
  8. ends 
Теперь немного теории. Чтобы узнать положение окна, надо воспользоваться функцией MonitorFromWindow с флагом MONITOR_DEFAULTTONEAREST, которая, в случае успеха, вернет хэндл монитора, на котором находится указанное окно, или хэндл дефолтного монитора в случае неудачи. Зная этот хэндл, можно получить параметры монитора при помощи функции GetMonitorInfo. В структуру MONITORINFO записываются размеры монитора и размеры его рабочей области, на основании которых мы и будем работать.

Читать статью целиком »
Просмотров: 1657 | Комментариев: 0

Обмен данными между процессами с помощью WM_COPYDATA

17.02.2018 | Категория: Образ мышления: Assembler | Автор: ManHunter

Обмен данными между процессами с помощью WM_COPYDATA

Обмен данными между процессами приложений может выполняться различными способами. Это может быть shared-память, буфер обмена, COM-объекты и другие высокоуровневые способы. Но наиболее простым и понятным способом является передача данных с использованием сообщения WM_COPYDATA. В этом случае обмен происходит через ядро системы с выделением памяти в принимающем процессе. Таким образом, например, выполняется взаимодействие с окном плеера JetAudio.

Читать статью целиком »
Просмотров: 2393 | Комментариев: 2

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

12.12.2017 | Категория: Образ мышления: 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 все повторные вызовы моргания будут игнорироваться.

Читать статью целиком »
Просмотров: 1246 | Комментариев: 0

Ассемблер: получаем имя файла оболочки

27.09.2017 | Категория: Образ мышления: Assembler | Автор: ManHunter
В этой статье я расскажу, как можно программно получить имя файла оболочки Windows. Зачем это нужно? Например, есть программа, которая инжектит свою библиотеку в работающую копию explorer.exe и при этом подразумевает, что такой процесс в системе гарантированно должен присутствовать. В подавляющем большинстве случаев действительно все работает, никаких нареканий нет. Но стоит запустить программу под альтернативным шеллом, например, Aston Desktop, и она неизбежно падает с ошибкой, потому что explorer.exe в системе вообще не запущен. Проверки на соответствие оболочки в программе нет, и вместо корректного информирования пользователя о причинах невозможности запуска мы получаем фатальное падение. И хорошо, если не вместе с системой.

Чтобы найти процесс оболочки, сперва надо определить ее главное окно. В MSDN для этого рекомендуют воспользоваться следующим кодом:
  1.         ; Найти окно с классом "Progman"
  2.         invoke  FindWindow, szClass, NULL
  3.         ...
  4. szClass db 'Progman',0
Недостатки такого способа, надеюсь, очевидны. Ничто не мешает любому приложению создать окно с классом "Progman", а при отсутствии запущенного штатного шелла это гарантированно приведет к неверным результатам.

Читать статью целиком »
Просмотров: 2013 | Комментариев: 3

Работа с Desktop Window Manager на Ассемблере

02.03.2017 | Категория: Образ мышления: Assembler | Автор: ManHunter

Работа с Desktop Window Manager на Ассемблере

Начиная с Windows Vista, в составе системы появился Desktop Window Manager, он же Диспетчер рабочего стола. Этот компонент обеспечивает визуальные эффекты и возможности интерфейса Windows Aero, например, такие как полупрозрачные заголовки окон, Aero Peek, Flip3D и живые миниатюры окон на таскбаре при наведении на него мышкой. Для взаимодействия с Desktop Window Manager разработчикам программ предоставляется целый набор функций API, с некоторыми из этих функций мы сегодня научимся работать.

Читать статью целиком »
Просмотров: 3175 | Комментариев: 6

01 ... 04 05 06 07 08 09 10 ... 14
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2022
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.14 сек. / MySQL: 3 (0.0604 сек.) / Память: 5 Mb
Наверх