
Быстрый поиск
Введите фрагмент названия статьи для поиска
Как на Ассемблере сделать скриншот отдельного окна
02.11.2015 | Категория: Образ мышления: Assembler | Автор: ManHunter
Одна из интересных задач при работе с окнами - захват и сохранение скриншота выбранного окна или всего экрана целиком. Во многих руководствах по программированию для этого рекомендуют использовать функцию BitBlt.Code (Assembler) : Убрать нумерацию
- ; Захват отдельного окна через BitBlt
- invoke GetWindowDC,[hWnd]
- mov [windowDC],eax
- invoke CreateCompatibleDC,[windowDC]
- mov [newDC],eax
- ; Создать пустой битмап для скриншота
- invoke CreateCompatibleBitmap,[windowDC],[window_width],[window_height]
- mov [hBitmap],eax
- invoke SelectObject,[newDC],[hBitmap]
- ; Флаг для захвата полупрозрачных окон
- CAPTUREBLT = 0x40000000
- invoke BitBlt,[newDC],0,0,[window_width],[window_height],[windowDC],\
- 0,0,SRCCOPY+CAPTUREBLT
- ; Теперь в [hBitmap] находится изображение (Bitmap) окна
Читать статью целиком »
Просмотров: 4855 | Комментариев: 8
Эффект водной поверхности на Ассемблере
10.10.2014 | Категория: Образ мышления: Assembler | Автор: ManHunter

Эффект водной поверхности на Ассемблере
Бесконечно можно смотреть на три вещи: как горит огонь, как течет вода и как работают другие люди. К горящему огню мы вернемся как-нибудь в другой раз, а сегодня я предлагаю полюбоваться на эффект водной поверхности, реализованный на чистом Ассемблере. Я неоднократно встречал этот эффект в патчах и кейгенах разных крякерских команд и считаю его одним из лучших визуальных эффектов. Одно время даже была мысль рипнуть его из готовых exe-файлов, но потом мне попался оригинал исходника на MASM. Недолго думая, я портировал его на FASM и с огромным удовольствием буду использовать в своих релизах.
Читать статью целиком »
Просмотров: 9134 | Комментариев: 19
Защита кнопок формы от автокликеров
10.02.2014 | Категория: Образ мышления: Assembler | Автор: ManHunter
В одной из прошлых статей я писал об управлении другим приложением из своей программы, в частности о возможности эмулировать нажатия на кнопки. Ненадолго переберусь на другую сторону баррикады и расскажу о нехитром способе, которым можно отличить реальные нажатия на кнопки от эмулированных. Заключается он в том, что при обработке клика проверяются экранные координаты, где это событие произошло. Если они находятся в пределах границ кнопки, то все нормально, иначе клик считается эмулированным. Координаты события можно получить при помощи функции GetMessagePos.Code (Assembler) : Убрать нумерацию
- button_clicked:
- ; Получить экранные координаты кнопки
- invoke GetDlgItem,[hwnddlg],ID_BUTTON
- invoke GetWindowRect,eax,pt
- ; Получить координаты произошедшего события
- invoke GetMessagePos
- ; Выделить координату Y
- mov ebx,eax
- shr ebx,16
- mov [y],ebx
- ; Выделить координату X
- mov ebx,eax
- and ebx,0FFFFh
- mov [x],ebx
- ; Проверка, чтобы событие произошло в пределах кнопки
- mov eax,[y]
- cmp eax,[pt.top]
- jb clicked_by_robot
- cmp eax,[pt.bottom]
- ja clicked_by_robot
- mov eax,[x]
- cmp eax,[pt.left]
- jb clicked_by_robot
- cmp eax,[pt.right]
- ja clicked_by_robot
- clicked_by_human:
- ; Кнопка нажата человеком
- ...
- clicked_by_robot:
- ; Кнопка нажата автоматически
- ...
Читать статью целиком »
Просмотров: 5946 | Комментариев: 17
Обработка нажатия на BUTTON разными кнопками мыши
03.01.2014 | Категория: Образ мышления: Assembler | Автор: ManHunter
Обычно элементы управления типа BUTTON в окне приложения реагируют только на обычное нажатие. При клике левой кнопкой мыши на кнопке или при нажатии на клавиатуре клавиши пробел, окну отправляется сообщение WM_COMMAND с параметром BN_CLICKED и идентификатором нажатой кнопки. На этом все. Но иногда надо сделать так, чтобы кнопки реагировали на клик не только левой кнопки мыши, а, например, правой кнопки или колесика. Этого можно добиться через субклассирование обработчика кнопки, ведь по сути она является самостоятельным окном. При инициализации основного окна повесим субклассированный обработчик на нужную нам кнопку:Code (Assembler) : Убрать нумерацию
- ; Субклассировать кнопку
- invoke GetDlgItem,[hwnddlg],ID_BTN
- mov ebx,eax
- ; Установить наш собственный обработчик
- invoke SetWindowLong,ebx,GWL_WNDPROC,ButtonProc
- ; Сохранить хэндл предыдущего обработчика
- invoke SetWindowLong,ebx,GWL_USERDATA,eax
Code (Assembler) : Убрать нумерацию
- ; Пользовательское сообщение от обработчика кнопки
- WM_BUTTON_CLICK = WM_USER + 275
- szMsg1 db 'Left mouse Button',0
- szMsg2 db 'Right mouse Button',0
- szMsg3 db 'Middle mouse Button',0
Читать статью целиком »
Просмотров: 9342 | Комментариев: 3
Добавление пунктов в системное меню окна
05.11.2013 | Категория: Образ мышления: Assembler | Автор: ManHunter
Некоторые программы добавляют свои пункты меню в стандартное системное меню, которое появляется при клике на иконку окна. Как это делается? Очень просто. При инициализации окна или при наступлении каких-либо определенных условий выполняется примерно следующий код:Code (Assembler) : Убрать нумерацию
- ; Получить хэндл системного меню окна
- invoke GetSystemMenu,[hwnddlg],0
- mov ebx,eax
- ; Добавить в меню полосу разделителя
- invoke InsertMenu,ebx,2,MF_BYPOSITION,0,0
- ; Идентификаторы сообщений при выборе пунктов меню
- IDM_MENU1 = 101
- IDM_MENU2 = 102
- ; Добавить свои пункты меню
- invoke InsertMenu,ebx,3,MF_BYCOMMAND,IDM_MENU1,szMenu1
- invoke InsertMenu,ebx,4,MF_BYCOMMAND,IDM_MENU2,szMenu2
- ...
- ...
- szMenu1 db 'About',0
- szMenu2 db 'Exit',0
Читать статью целиком »
Просмотров: 6283 | Комментариев: 5


