Образ мышления: Assembler
То, что не удается запрограммировать на Ассемблере, приходится паять
Образ мышления: Assembler - RSS-канал
Образ мышления: Assembler - Карта сайта
Как сделать перетаскиваемый курсор-прицел
21.10.2023 | Категория: Образ мышления: Assembler | Автор: ManHunter
У многих программ для работы с окнами приложений есть такая фича, как перетаскиваемый указатель-прицел, с помощью которого можно выбрать определенное окно. Когда-то у меня в комментариях спросили, как можно сделать что-то подобное. Что ж, лучше поздно, чем никогда.Начнем с теории, как это все должно работать. На форме программы сперва рисуется значок прицела, это самая обычная статическая картинка. При клике на нее активируется процесс перетаскивания. Системный курсор меняется на этот же прицел, а значок на форме скрывается. Тем самым достигается визуальный эффект, что перетаскивается именно прицел с формы. Пока кнопка мыши нажата, обрабатываются координаты курсора и выполняются нужные действия с этой информацией. При отпускании кнопки мыши курсор меняется на дефолтный системный, а на форме снова отображается картинка. Таким образом нам надо отслеживать три сообщения окна: WM_LBUTTONDOWN для нажатия левой кнопки мыши, WM_LBUTTONUP для ее отпускания и WM_MOUSEMOVE для перемещения мыши.
Code (Assembler) : Убрать нумерацию
- cmp [msg],WM_LBUTTONDOWN
- je .wmsetcursor
- cmp [msg],WM_LBUTTONUP
- je .wmreleasecursor
- cmp [msg],WM_MOUSEMOVE
- je .wmmousemove
Code (Assembler) : Убрать нумерацию
- .wmsetcursor:
- ; Получить координаты события
- invoke GetMessagePos
- ; Координата Y
- mov ebx,eax
- shr ebx,16
- mov [pt.y],ebx
- ; Координата X
- mov ebx,eax
- and ebx,0FFFFh
- mov [pt.x],ebx
- ; Получить границы иконки
- invoke GetWindowRect,[hStatic],img
- ; Клик произошел в области иконки?
- invoke PtInRect,img,[pt.x],[pt.y]
- or eax,eax
- jz .processed
- ; Установить захват событий мыши
- invoke SetCapture,[hwnddlg]
- ; Загрузить наш курсор
- invoke SetCursor,[hCursor]
- ; Скрыть иконку на форме
- invoke SendMessage,[hStatic],STM_SETIMAGE,IMAGE_CURSOR,0
- mov [state],1
Читать статью целиком »
Просмотров: 643 | Комментариев: 2
Как отследить смену питания на ноутбуке
15.10.2023 | Категория: Образ мышления: Assembler | Автор: ManHunter
Как отследить смену питания на ноутбуке
Дополнение к статье о получении информации об оставшемся заряде батареи ноутбука. Запрос состояния батареи по мере надобности - это хорошо, но будет гораздо правильнее, если система сама будет уведомлять наше приложение об изменении типа электропитания, а также об оставшемся заряде аккумулятора. Сегодня я расскажу, как это делается.
Читать статью целиком »
Просмотров: 472 | Комментариев: 0
Конвертирование строки из КОИ-8 в cp1251 и обратно
03.10.2023 | Категория: Образ мышления: Assembler | Автор: ManHunter
Кодировка KOI8-R
КОИ-8 - код обмена информацией - восьмибитовая кодовая страница, разработанная для кодирования букв кириллических алфавитов. КОИ-8 в свое время была широко распространена как основная русская кодировка в UNIX-совместимых ОС и в электронной почте. Существует несколько вариантов КОИ-8, в этой статье я расскажу, как можно конвертировать строку из KOI8-R (русская) в стандартную виндовую кодировку cp1251 и обратно.
Читать статью целиком »
Просмотров: 1452 | Комментариев: 2
Отслеживание изменения метки тома
27.09.2023 | Категория: Образ мышления: Assembler | Автор: ManHunter
Несколько лет назад я демонстрировал, как можно легко и просто отслеживать изменения в каком-нибудь каталоге. Кроме отслеживания подобных глобальных движений, система позволяет отслеживать изменения более точечно, например, на отдельных объектах файловой системы. Для этого есть функция SHChangeNotifyRegister. В качестве примера я разберу, как можно отслеживать изменение метки тома. На самом деле функция SHChangeNotifyRegister обладает гораздо более широкими возможностями по отслеживанию различных системных уведомлений.Сперва небольшое количество данных для работы, которые отсутствуют в инклудах FASM.
Code (Assembler) : Убрать нумерацию
- struct SHChangeNotifyEntry
- pidl dd ?
- fRecursive dd ?
- ends
- SHCNRF_ShellLevel = 0x0002
- SFGAO_FILESYSTEM = 0x40000000
- SHCNE_RENAMEFOLDER = 0x00020000
Code (Assembler) : Убрать нумерацию
- ; Настроить отслеживаемый объект
- invoke SHParseDisplayName,szWatch,NULL,\
- pidl,SFGAO_FILESYSTEM,NULL
- ; Заполнить массив отслеживаемых объектов
- mov eax,[pidl]
- mov [shentry.pidl],eax
- mov [shentry.fRecursive],FALSE
- ; Зарегистрировать обработчик уведомлений
- invoke SHChangeNotifyRegister,\
- [hwnddlg],\
- SHCNRF_ShellLevel,\
- SHCNE_RENAMEFOLDER,\
- WM_LABEL_CHANGED,\
- 1,\
- shentry
- mov [cookie],eax
- ; Освободить неиспользуемую память
- invoke CoTaskMemFree,[pidl]
Код WM_LABEL_CHANGED - это пользовательское сообщение окну приложения, его можно описать, например, как WM_LABEL_CHANGED = WM_USER + 200. При поступлении уведомления от системы именно это сообщение будет отправлено целевому окну обработчика. В параметре lParam находится код события, что очень полезно, когда приложение подписано сразу на несколько событий.
Читать статью целиком »
Просмотров: 432 | Комментариев: 0
Проверка цифровой подписи исполняемого файла
22.09.2023 | Категория: Образ мышления: Assembler | Автор: ManHunter
Проверка цифровой подписи исполняемого файла
Цифровая подпись в настоящее время является одним из основных способов подтверждения, что файл не был модифицирован, что он получен от достоверного источника и что он принадлежит именно тому издателю, который заявлен. Использование современных криптографических алгоритмов практически исключают возможность ее подделки. А вот как программно проверить цифровую подпись исполняемых файлов - это я вам сейчас расскажу.
Читать статью целиком »
Просмотров: 1044 | Комментариев: 1