Быстрый поиск
Введите фрагмент названия статьи для поиска
Как получить список поддерживаемых кодировок
05.11.2023 | Категория: Образ мышления: Assembler | Автор: ManHunter
Сегодняшний небольшой пример кода - получение списка всех поддерживаемых кодировок в системе. Примерно такой список можно увидеть в меню сохранения в текстовых редакторах или в браузерах, когда надо выбрать кодировку страницы. Если ваше приложение умеет работать с разными кодировками, то значит должно уметь и получать их список.Начинаем с констант и структуры, которые отсутствуют в FASM.
Code (Assembler) : Убрать нумерацию
- CP_SUPPORTED = 0x00000002
- MAX_LEADBYTES = 12
- MAX_DEFAULTCHAR = 2
- struct CPINFOEX
- MaxCharSize dd ?
- DefaultChar rb MAX_DEFAULTCHAR
- LeadByte rb MAX_LEADBYTES
- UnicodeDefaultChar dw ?
- CodePage dd ?
- CodePageName rb MAX_PATH
- ends
Code (Assembler) : Убрать нумерацию
- ; Получить список поддерживаемых кодировок
- invoke EnumSystemCodePages,CodePageEnumProc,CP_SUPPORTED
Читать статью целиком »
Просмотров: 448 | Комментариев: 0
Устраняем косяки функций PathRemoveExtension и PathRenameExtension
24.10.2023 | Категория: Образ мышления: Assembler | Автор: ManHunter
В комментариях к статьям иногда проскакивают мысли, мол, зачем изобретать велосипед, если уже существуют готовые WinAPI. Ну так вот, в библиотеке shlwapi помимо кучи других полезных функций есть две функции для работы с расширениями файлов. PathRemoveExtension служит для удаления расширения из строки с путем файла, а PathRenameExtension для замены имеющегося расширения на другое. Это очень удобно в случае, когда, например, надо сгенерировать имя файла данных или файла с настройками по имени исполняемого файла. Но, к сожалению, у них есть фатальные косяки в реализации. Это проще показать на примерах. Вот удаление расширения:c:\test\file1.txt -> PathRemoveExtension -> c:\test\file1
c:\test\file2 -> PathRemoveExtension -> c:\test\file2
c:\test\.htaccess -> PathRemoveExtension -> c:\test\
c:\test\.htaccess.bak -> PathRemoveExtension -> c:\test\.htaccess
И аналогично для замены расширения, например, на ".ini":
c:\test\file1.txt -> PathRenameExtension -> c:\test\file1.ini
c:\test\file2 -> PathRenameExtension -> c:\test\file2.ini
c:\test\.htaccess -> PathRenameExtension -> c:\test\.ini
c:\test\ -> PathRenameExtension -> c:\test\.ini
c:\test\.htaccess.bak -> PathRenameExtension -> c:\test\.htaccess.ini
Как видите, если имя файла начинается с точки и при этом файл не имеет расширения, то обе функции работают неправильно. Кроме этого, функция замены расширения дает неправильный с точки зрения логики результат, если имя файла в строке вообще отсутствует.
Читать статью целиком »
Просмотров: 355 | Комментариев: 0
Как сделать перетаскиваемый курсор-прицел
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
Читать статью целиком »
Просмотров: 683 | Комментариев: 2
Как отследить смену питания на ноутбуке
15.10.2023 | Категория: Образ мышления: Assembler | Автор: ManHunter
Как отследить смену питания на ноутбуке
Дополнение к статье о получении информации об оставшемся заряде батареи ноутбука. Запрос состояния батареи по мере надобности - это хорошо, но будет гораздо правильнее, если система сама будет уведомлять наше приложение об изменении типа электропитания, а также об оставшемся заряде аккумулятора. Сегодня я расскажу, как это делается.
Читать статью целиком »
Просмотров: 483 | Комментариев: 0
Конвертирование строки из КОИ-8 в cp1251 и обратно
03.10.2023 | Категория: Образ мышления: Assembler | Автор: ManHunter
Кодировка KOI8-R
КОИ-8 - код обмена информацией - восьмибитовая кодовая страница, разработанная для кодирования букв кириллических алфавитов. КОИ-8 в свое время была широко распространена как основная русская кодировка в UNIX-совместимых ОС и в электронной почте. Существует несколько вариантов КОИ-8, в этой статье я расскажу, как можно конвертировать строку из KOI8-R (русская) в стандартную виндовую кодировку cp1251 и обратно.
Читать статью целиком »
Просмотров: 1488 | Комментариев: 2