Blog. Just Blog

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

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

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

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 обеспечивает захват полупрозрачных окон с альфа-каналом. Способ реально рабочий, очень простой в реализации, но у него есть один огромный недостаток. Если окно, с которого требуется сделать снимок, перекрыто другими окнами или частично находится за пределами экрана, то оно так и будет сохранено с перекрывающими кусками чужих окон, а отсутствующая на экране область и вовсе будет заменена черным пятном.

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

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

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

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

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

Читать статью целиком »
Просмотров: 9134 | Комментариев: 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.         ...
Недостаток такого способа в том, что при работе с кнопками и полями формы с клавиатуры, координаты события все равно будут передаваться на основании положения курсора мыши. Эту проблему можно решить через субклассированный обработчик, в котором придется подавлять нажатия с клавиатуры. Ну и не забывайте о том, что никто не мешает так же программно передвинуть курсор на кнопку и "кликнуть" на ней, так что это защита только от самых простейших автокликеров. А адептам Темной стороны Силы будет полезно знать о такой возможности защиты, хотя на практике я ничего подобного не встречал.

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

Обработка нажатия на BUTTON разными кнопками мыши

03.01.2014 | Категория: Образ мышления: Assembler | Автор: ManHunter
Обычно элементы управления типа BUTTON в окне приложения реагируют только на обычное нажатие. При клике левой кнопкой мыши на кнопке или при нажатии на клавиатуре клавиши пробел, окну отправляется сообщение WM_COMMAND с параметром BN_CLICKED и идентификатором нажатой кнопки. На этом все. Но иногда надо сделать так, чтобы кнопки реагировали на клик не только левой кнопки мыши, а, например, правой кнопки или колесика. Этого можно добиться через субклассирование обработчика кнопки, ведь по сути она является самостоятельным окном. При инициализации основного окна повесим субклассированный обработчик на нужную нам кнопку:
  1.         ; Субклассировать кнопку
  2.         invoke  GetDlgItem,[hwnddlg],ID_BTN
  3.         mov     ebx,eax
  4.         ; Установить наш собственный обработчик
  5.         invoke  SetWindowLong,ebx,GWL_WNDPROC,ButtonProc
  6.         ; Сохранить хэндл предыдущего обработчика
  7.         invoke  SetWindowLong,ebx,GWL_USERDATA,eax
Еще нам понадобятся идентификатор сообщения, которое будет отправляться из обработчика родительскому окну и текстовые строчки, при помощи которых родительское окно будет реагировать на это сообщение.
  1. ; Пользовательское сообщение от обработчика кнопки
  2. WM_BUTTON_CLICK = WM_USER + 275
  3.  
  4. szMsg1  db     'Left mouse Button',0
  5. szMsg2  db     'Right mouse Button',0
  6. szMsg3  db     'Middle mouse Button',0
Общую структуру субклассированного обработчика я повторять здесь не буду, на сайте выложена уже не одна статья, где он используется. Но теперь нам надо определиться со списком сообщений, которые он должен обрабатывать. Обычная кнопка срабатывает от клавиатуры и от мышки, значит нам надо обрабатывать как минимум сообщения WM_KEYDOWN и WM_LBUTTONDOWN. А раз мы хотим отлавливать нажатия и других кнопок мыши, то к этому списку добавляются WM_MBUTTONDOWN и WM_RBUTTONDOWN.

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

Добавление пунктов в системное меню окна

05.11.2013 | Категория: Образ мышления: Assembler | Автор: ManHunter
Некоторые программы добавляют свои пункты меню в стандартное системное меню, которое появляется при клике на иконку окна. Как это делается? Очень просто. При инициализации окна или при наступлении каких-либо определенных условий выполняется примерно следующий код:
  1.         ; Получить хэндл системного меню окна
  2.         invoke  GetSystemMenu,[hwnddlg],0
  3.         mov     ebx,eax
  4.  
  5.         ; Добавить в меню полосу разделителя
  6.         invoke  InsertMenu,ebx,2,MF_BYPOSITION,0,0
  7.  
  8.         ; Идентификаторы сообщений при выборе пунктов меню
  9.         IDM_MENU1 = 101
  10.         IDM_MENU2 = 102
  11.  
  12.         ; Добавить свои пункты меню
  13.         invoke  InsertMenu,ebx,3,MF_BYCOMMAND,IDM_MENU1,szMenu1
  14.         invoke  InsertMenu,ebx,4,MF_BYCOMMAND,IDM_MENU2,szMenu2
  15.         ...
  16.         ...
  17. szMenu1 db 'About',0
  18. szMenu2 db 'Exit',0
В этом примере используется функция InsertMenu, так как нам надо просто добавить пункты в меню. Если планируется использование дополнительных спецэффектов, то эту функцию можно заменить на более современную InsertMenuItem.

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

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