Blog. Just Blog

Образ мышления: Assembler

То, что не удается запрограммировать на Ассемблере, приходится паять
Образ мышления: Assembler - RSS-канал Образ мышления: Assembler - Карта сайта

Создание пользовательского MessageBox с помощью SoftModalMessageBox

14.03.2022 | Категория: Образ мышления: Assembler | Автор: ManHunter
Ранее я уже рассказывал, каким образом можно кастомизировать стандартный MessageBox при помощи хуков, в частности, менять надписи на кнопках. Сегодня разберем создание MessageBox с помощью недокументированной функции SoftModalMessageBox. В качестве единственного параметра она принимает указатель на структуру MSGBOXDATA, которая тоже относится к недокументированным:
  1. struct MSGBOXDATA
  2.         params         MSGBOXPARAMS
  3.         pwndOwner      dd ?  ; Хэндл окна-владельца
  4.         wLanguageId    dd ?  ; Идентификатор языка
  5.         pidButton      dd ?  ; Массив с идентификаторами кнопок
  6.         ppszButtonText dd ?  ; Массив с указателями на строки текста
  7.         cButtons       dd ?  ; Количество кнопок в окне
  8.         DefButton      dd ?  ; Кнопка по умолчанию
  9.         CancelId       dd ?  ; Идентификатор кнопки отмены
  10.         Timeout        dd ?  ; Таймаут окна
  11.         Unknown        rd 5  ; Зарезервировано
  12. ends
Давайте подробно разберем ее поля, так как никаких нормальных описаний в рунете я не нашел, пришлось собирать информацию по крупицам. Первый параметр - документированная структура MSGBOXPARAMS, в ней можно настроить, например, пользовательскую иконку, которая будет отображаться в MessageBox. Подробное описание структуры есть в MSDN, дублировать его не буду. Поля pwndOwner и wLanguageId сложности не представляют, это хэндл окна-владельца и идентификатор языка, на котором будет выведен текст в окне сообщения. Поле pidButton - указатель на массив DWORD'ов, которые являются идентификаторами кнопок в создаваемом окне. Важное замечание. Идентификаторы кнопок должны быть строго одним из стандартных значений, возвращаемых обычной функцией MessageBox. Любое другое значение будет проигнорировано, а соответствующая кнопка при нажатии не будет ничего делать. В поле ppszButtonText записывается указатель на массив указателей на юникодные строки, которые будут использоваться в качестве надписей на кнопках. Размер кнопок под длину надписей не подгоняется, берется максимальный системный размер кнопки для текущей локали, так что без фанатизма. cButtons - количество кнопок в окне. Этому количеству должно соответствовать количество элементов в массиве идентификаторов и в массиве указателей на названия. DefButton - кнопка по умолчанию, нумерация кнопок начинается с 0. В поле CancelId по задумке должен быть идентификатор, отвечающий за кнопку отмены, но по факту это поле игнорируется. Нулевое значение деактивирует крестик закрытия в заголовке окна сообщения. Timeout задает интервал, после которого окно автоматически закроется, об этом я рассказывал в одной из предыдущих статей.

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

Парсинг метаданных MP3-файлов на Ассемблере

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

Парсинг метаданных MP3-файлов на Ассемблере

В одной из предыдущих статей я рассказал, как можно получить данные из различных тегов MP3-файлов. Но, как выяснилось, системная реализация не в состоянии корректно обработать некоторые строковые данные. Например, название исполнителя "To/Die/For" обрезается до строки "To". Это связано с особенностями стандарта ID3v2.3, в котором символ слеша является служебным и используется для разделения нескольких значений. При этом в заголовке MP3-файла версия тегов может быть обозначена как ID3v2.4, в которой это ограничение снято, но система все равно будет обрабатывать данные по более старому стандарту. И вот опять, если хочешь сделать что-то хорошо, сделай это сам.

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

GIF-анимация на Ассемблере

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

GIF-анимация на Ассемблере

Выводить статическое изображение на форму мы уже научились, причем разными способами, теперь давайте попробуем вывести анимированный GIF-файл. Для этого даже не понадобится углубляться в дебри формата, будем работать с высокоуровневыми функциями GDI+.

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

Таймер в консольном приложении

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

Таймер в консольном приложении

Продолжаем раскрывать возможности консоли. Сегодня это будет выполнение действий через определенные интервалы, то есть, проще говоря, таймеры. В некоторых интернетах всплывает информация, что, мол, таймеры в консольных приложениях не поддерживаются или для этого надо городить какие-то жуткие конструкции типа отдельных потоков с проверкой времени. На самом деле консоль прекрасно работает с функцией SetTimer, только надо ее, как говорится, правильно готовить.

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

Обработка событий в консоли

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

Обработка событий в консоли

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

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

Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2022
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.1 сек. / MySQL: 2 (0.0033 сек.) / Память: 4.75 Mb
Наверх