Blog. Just Blog

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

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

Красивый градиентный ProgressBar на Ассемблере

25.07.2016 | Категория: Образ мышления: Assembler | Автор: ManHunter
Элемент ProgressBar, он же индикатор прогресса, используется в тех случаях, когда нужно показать пользователю степень завершения какого-либо действия. Есть стандартный элемент msctls_progress32, но он практически не поддается настройке в плане дизайна. Например, его нельзя сделать градиентным, чтобы заливка плавно перетекала от зеленого, через желтый и до красного. Но можно нарисовать красивую полосу ProgressBar самостоятельно. Идею я позаимствовал у kero, знаю, что он сюда иногда заглядывает и надеюсь, что он будет не против. Оригинал написан на MASM, я доработал его и портировал на FASM.


Принцип создания градиентного ProgressBar

Принцип создания градиентного прогрессбара заключается в том, что на элемент STATIC на всю его площадь накладывается готовое изображение. Затем создается дополнительное непрозрачное окно, являющееся дочерним к STATIC и расположенное поверх него. Регулируя размер и положение этого дочернего окна, открывается та или иная площадь изображения, пропорционально нужному проценту заполнения. Это чем-то напоминает создание рейтингов на CSS. Еще одна хитрость заключается в том, что изображение прогрессбара загружается из ресурсов функцией LoadImage, которая позволяет сразу указывать нужные размеры. Если исходное изображение меньше, то оно автоматически растягивается. Таким образом, для создания цветного прогрессбара достаточно однопиксельного изображения, а из крохотного bitmap'а шириной всего в три пиксела получается красивый градиентный прогрессбар любого размера.

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

Программы для работы с окнами приложений

01.07.2016 | Категория: Темная сторона Силы | Автор: ManHunter

Программы для работы с окнами приложений

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

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

Как на Ассемблере сделать скриншот отдельного окна

02.11.2015 | Категория: Образ мышления: Assembler | Автор: ManHunter
Одна из интересных задач при работе с окнами - захват и сохранение скриншота выбранного окна или всего экрана целиком. Во многих руководствах по программированию для этого рекомендуют использовать функцию BitBlt.
  1.         ; Захват отдельного окна через BitBlt
  2.         invoke  GetWindowDC,[hWnd]
  3.         mov     [windowDC],eax
  4.  
  5.         invoke  CreateCompatibleDC,[windowDC]
  6.         mov     [newDC],eax
  7.  
  8.         ; Создать пустой битмап для скриншота
  9.         invoke  CreateCompatibleBitmap,[windowDC],[window_width],[window_height]
  10.         mov     [hBitmap],eax
  11.  
  12.         invoke  SelectObject,[newDC],[hBitmap]
  13.  
  14.         ; Флаг для захвата полупрозрачных окон
  15.         CAPTUREBLT = 0x40000000
  16.         invoke  BitBlt,[newDC],0,0,[window_width],[window_height],[windowDC],\
  17.                 0,0,SRCCOPY+CAPTUREBLT
  18.         ; Теперь в [hBitmap] находится изображение (Bitmap) окна
Флаг CAPTUREBLT обеспечивает захват полупрозрачных окон с альфа-каналом. Способ реально рабочий, очень простой в реализации, но у него есть один огромный недостаток. Если окно, с которого требуется сделать снимок, перекрыто другими окнами или частично находится за пределами экрана, то оно так и будет сохранено с перекрывающими кусками чужих окон, а отсутствующая на экране область и вовсе будет заменена черным пятном.

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

Эффект водной поверхности на Ассемблере

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

Эффект водной поверхности на Ассемблере

Бесконечно можно смотреть на три вещи: как горит огонь, как течет вода и как работают другие люди. К горящему огню мы вернемся как-нибудь в другой раз, а сегодня я предлагаю полюбоваться на эффект водной поверхности, реализованный на чистом Ассемблере. Я неоднократно встречал этот эффект в патчах и кейгенах разных крякерских команд и считаю его одним из лучших визуальных эффектов. Одно время даже была мысль рипнуть его из готовых exe-файлов, но потом мне попался оригинал исходника на MASM. Недолго думая, я портировал его на FASM и с огромным удовольствием буду использовать в своих релизах.

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

Защита кнопок формы от автокликеров

10.02.2014 | Категория: Образ мышления: Assembler | Автор: ManHunter
В одной из прошлых статей я писал об управлении другим приложением из своей программы, в частности о возможности эмулировать нажатия на кнопки. Ненадолго переберусь на другую сторону баррикады и расскажу о нехитром способе, которым можно отличить реальные нажатия на кнопки от эмулированных. Заключается он в том, что при обработке клика проверяются экранные координаты, где это событие произошло. Если они находятся в пределах границ кнопки, то все нормально, иначе клик считается эмулированным. Координаты события можно получить при помощи функции GetMessagePos.
  1. button_clicked:
  2.         ; Получить экранные координаты кнопки
  3.         invoke  GetDlgItem,[hwnddlg],ID_BUTTON
  4.         invoke  GetWindowRect,eax,pt
  5.  
  6.         ; Получить координаты произошедшего события
  7.         invoke  GetMessagePos
  8.  
  9.         ; Выделить координату Y
  10.         mov     ebx,eax
  11.         shr     ebx,16
  12.         mov     [y],ebx
  13.  
  14.         ; Выделить координату X
  15.         mov     ebx,eax
  16.         and     ebx,0FFFFh
  17.         mov     [x],ebx
  18.  
  19.         ; Проверка, чтобы событие произошло в пределах кнопки
  20.         mov     eax,[y]
  21.         cmp     eax,[pt.top]
  22.         jb      clicked_by_robot
  23.         cmp     eax,[pt.bottom]
  24.         ja      clicked_by_robot
  25.  
  26.         mov     eax,[x]
  27.         cmp     eax,[pt.left]
  28.         jb      clicked_by_robot
  29.         cmp     eax,[pt.right]
  30.         ja      clicked_by_robot
  31.  
  32. clicked_by_human:
  33.         ; Кнопка нажата человеком
  34.         ...
  35.  
  36. clicked_by_robot:
  37.         ; Кнопка нажата автоматически
  38.         ...
Недостаток такого способа в том, что при работе с кнопками и полями формы с клавиатуры, координаты события все равно будут передаваться на основании положения курсора мыши. Эту проблему можно решить через субклассированный обработчик, в котором придется подавлять нажатия с клавиатуры. Ну и не забывайте о том, что никто не мешает так же программно передвинуть курсор на кнопку и "кликнуть" на ней, так что это защита только от самых простейших автокликеров. А адептам Темной стороны Силы будет полезно знать о такой возможности защиты, хотя на практике я ничего подобного не встречал.

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

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