Blog. Just Blog

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

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

Получение и изменение обоев рабочего стола на Ассемблере

14.01.2023 | Категория: Образ мышления: Assembler | Автор: ManHunter
Тема обоев рабочего стола Windows уже поднималась тут несколько раз, но это были, в основном, какие-то готовые программные решения. Настало время заглянуть "под капот" системы и посмотреть, как оно устроено. А лучшего инструмента, чем Ассемблер, для этих целей сложно придумать.

Начнем с получения информации об установленных обоях рабочего стола. Тут ничего сложного, достаточно вызвать функцию SystemParametersInfo с параметром SPI_GETDESKWALLPAPER.
  1.         SPI_GETDESKWALLPAPER = 0x0073
  2.  
  3.         invoke  SystemParametersInfo,SPI_GETDESKWALLPAPER,\
  4.                 MAX_PATH,szPath,0
  5.         ; szPath -> строка пути к файлу обоев
После выполнения этого кода в переменную szPath будет записана строка с расположением файла обоев на диске. Больше никакой информации типа положения изображения получить нельзя. В результате экспериментов выяснилось, что при смене обоев через системное меню "Персонализация", выбранный файл с изображением копируется в папку с пользовательскими темами, а при программной установке остается на месте. Особой практической пользы в этом знании нет, просто интересный факт.

Теперь переходим к смене обоев рабочего стола. В интернетах для этих целей обычно рекомендуют использовать упомянутую выше функцию SystemParametersInfo с параметром SPI_SETDESKWALLPAPER. Код получается минимальный, все очень просто реализуется, выглядит на первый взгляд стильно, модно, молодежно.
  1. ; Путь к файлу с новыми обоями рабочего стола
  2. szPath  db 'c:\windows\wallpaper.bmp',0
  3.  
  4.         SPI_SETDESKWALLPAPER  = 20
  5.         SPIF_SENDWININICHANGE = 2
  6.         SPIF_UPDATEINIFILE    = 1
  7.  
  8.         invoke  SystemParametersInfo,SPI_SETDESKWALLPAPER,\
  9.                 0,szPath,SPIF_UPDATEINIFILE+SPIF_SENDWININICHANGE
Минусы этого способа перекрывают все плюсы. Нет возможности настраивать режим отображения обоев. Новые обои отображаются в том же положении, в котором были установлены текущие, если старое и новое изображения имеют разные пропорции, то результат будет печальным. А главное, что в некоторых случаях невозможно использовать файлы графических форматов кроме BMP, хотя через меню "Персонализация" они устанавливаются без вопросов.

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

Получение кода HTML-страницы и отдельных тегов

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

Получение кода HTML-страницы и отдельных тегов

Ранее мы уже познакомились с такой интересной штукой, как встроенный браузер на Ассемблере. Но его применение именно в таком виде весьма ограниченно. А вот работа с исходным текстом загруженной страницы, извлечение из нее данных, взаимодействие с элементами - это совершенно другой уровень полезности.

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

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

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

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

В этой статье разберем способы, как можно получить информацию из метаданных Windows Media Files, к которым относятся такие форматы, как WMV, ASF и WMA. По структуре они все очень похожи, поэтому работать будем с чем-то одним, например, с Windows Media Audio. И хоть разбирать вручную внутренности файлов гораздо интереснее, это тот случай, когда лучше поручить всю грязную работу самой системе.

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

Вывод изображения на Ассемблере с помощью WIC

13.08.2022 | Категория: Образ мышления: Assembler | Автор: ManHunter
На сайте уже есть две статьи про загрузку и вывод изображения с помощью GDI+ и OLE, сегодня расскажу про еще очередной способ загрузки изображений, на этот раз с помощью WIC (Windows Imaging Component). Эта технология позволяет не привязываться к конкретным форматам изображений, а делегировать большую часть рутинной работы системе. Если установлен соответствующий графический кодек и система в принципе может открыть изображение во встроенном Просмотрщике фотографий, значит его можно будет прочитать и при помощи Windows Imaging Component. Например, популярный формат WebP в чистой Windows 7 не открывается, но если поставить кодеки, то все сразу заработает.

Переходим к программированию. Поскольку это COM-технология, то нам понадобится описание множества GUID, констант и интерфейсов. Надо ли говорить, что FASM про них ничего не знает? А множество действительно внушительное.
  1. ; GUID {CACAF262-9370-4615-A13B-9F5539DA4C0A}
  2. CLSID_WICImagingFactory dd 0CACAF262h
  3.                         dw 09370h
  4.                         dw 04615h
  5.                         db 0A1h, 03Bh, 09Fh, 055h, 039h, 0DAh, 04Ch, 00Ah
  6.  
  7. ; GUID {EC5EC8A9-C395-4314-9C77-54D7A935FF70}
  8. IID_IWICImagingFactory dd 0EC5EC8A9h
  9.                        dw 0C395h
  10.                        dw 04314h
  11.                        db 09Ch, 077h, 054h, 0D7h, 0A9h, 035h, 0FFh, 070h
  12.  
  13. ; IID_IWICImagingFactory Interface
  14. struct IWICImagingFactory
  15.     ; IUnknown
  16.     QueryInterface                           dd ?   ; 000h
  17.     AddRef                                   dd ?   ; 004h
  18.     Release                                  dd ?   ; 008h
  19.     ; IWICImagingFactory
  20.     CreateDecoderFromFilename                dd ?   ; 00Ch
  21.     CreateDecoderFromStream                  dd ?   ; 010h
  22.     CreateDecoderFromFileHandle              dd ?   ; 014h
  23.     CreateComponentInfo                      dd ?   ; 018h
  24.     CreateDecoder                            dd ?   ; 01Ch
  25.     CreateEncoder                            dd ?   ; 020h
  26.     CreatePalette                            dd ?   ; 024h
  27.     CreateFormatConverter                    dd ?   ; 028h
  28.     CreateBitmapScaler                       dd ?   ; 02Ch
  29.     CreateBitmapClipper                      dd ?   ; 030h
  30.     CreateBitmapFlipRotator                  dd ?   ; 034h
  31.     CreateStream                             dd ?   ; 038h
  32.     CreateColorContext                       dd ?   ; 03Ch
  33.     CreateColorTransformer                   dd ?   ; 040h
  34.     CreateBitmap                             dd ?   ; 044h
  35.     CreateBitmapFromSource                   dd ?   ; 048h
  36.     CreateBitmapFromSourceRect               dd ?   ; 04Ch
  37.     CreateBitmapFromMemory                   dd ?   ; 050h
  38.     CreateBitmapFromHBITMAP                  dd ?   ; 054h
  39.     CreateBitmapFromHICON                    dd ?   ; 058h
  40.     CreateComponentEnumerator                dd ?   ; 05Ch
  41.     CreateFastMetadataEncoderFromDecoder     dd ?   ; 060h
  42.     CreateFastMetadataEncoderFromFrameDecode dd ?   ; 064h
  43.     CreateQueryWriter                        dd ?   ; 068h
  44.     CreateQueryWriterFromReader              dd ?   ; 06Ch
  45. ends
  46.  
  47. ; IID_IWICBitmapDecoder Interface
  48. struct IWICBitmapDecoder
  49.     ; IUnknown
  50.     QueryInterface         dd ?   ; 000h
  51.     AddRef                 dd ?   ; 004h
  52.     Release                dd ?   ; 008h
  53.     ; IWICBitmapDecoder
  54.     QueryCapability        dd ?   ; 00Ch
  55.     Initialize             dd ?   ; 010h
  56.     GetContainerFormat     dd ?   ; 014h
  57.     GetDecoderInfo         dd ?   ; 018h
  58.     CopyPalette            dd ?   ; 01Ch
  59.     GetMetadataQueryReader dd ?   ; 020h
  60.     GetPreview             dd ?   ; 024h
  61.     GetColorContexts       dd ?   ; 028h
  62.     GetThumbnail           dd ?   ; 02Ch
  63.     GetFrameCount          dd ?   ; 030h
  64.     GetFrame               dd ?   ; 034h
  65. ends
  66.  
  67. ; IWICBitmapFrameDecode Interface
  68. struct IWICBitmapFrameDecode
  69.     ; IUnknown
  70.     QueryInterface         dd ?   ; 000h
  71.     AddRef                 dd ?   ; 004h
  72.     Release                dd ?   ; 008h
  73.     ; IWICBitmapFrameDecode
  74.     GetSize                dd ?   ; 00Ch
  75.     GetPixelFormat         dd ?   ; 010h
  76.     GetResolution          dd ?   ; 014h
  77.     CopyPalette            dd ?   ; 018h
  78.     CopyPixels             dd ?   ; 01Ch
  79.     GetMetadataQueryReader dd ?   ; 020h
  80.     GetColorContexts       dd ?   ; 024h
  81.     GetThumbnail           dd ?   ; 028h
  82. ends
  83.  
  84. ; IID_IWICFormatConverter Interface
  85. struct IWICFormatConverter
  86.     ; IUnknown
  87.     QueryInterface dd ?   ; 000h
  88.     AddRef         dd ?   ; 004h
  89.     Release        dd ?   ; 008h
  90.     ; IWICFormatConverter
  91.     GetSize        dd ?   ; 00Ch
  92.     GetPixelFormat dd ?   ; 010h
  93.     GetResolution  dd ?   ; 014h
  94.     CopyPalette    dd ?   ; 018h
  95.     CopyPixels     dd ?   ; 01Ch
  96.     Initialize     dd ?   ; 020h
  97.     CanConvert     dd ?   ; 024h
  98. ends
  99.  
  100. ; IID_IWICBitmap Interface
  101. struct IWICBitmap
  102.     ; IUnknown
  103.     QueryInterface dd ?   ; 000h
  104.     AddRef         dd ?   ; 004h
  105.     Release        dd ?   ; 008h
  106.     ; IWICBitmap
  107.     GetSize        dd ?   ; 00Ch
  108.     GetPixelFormat dd ?   ; 010h
  109.     GetResolution  dd ?   ; 014h
  110.     CopyPalette    dd ?   ; 018h
  111.     CopyPixels     dd ?   ; 01Ch
  112.     Lock           dd ?   ; 020h
  113.     SetPalette     dd ?   ; 024h
  114.     SetResolution  dd ?   ; 028h
  115. ends
  116.  
  117. ; IID_IWICBitmapLock Interface
  118. struct IWICBitmapLock
  119.     ; IUnknown
  120.     QueryInterface dd ?   ; 000h
  121.     AddRef         dd ?   ; 004h
  122.     Release        dd ?   ; 008h
  123.     ; IWICBitmapLock
  124.     GetSize        dd ?   ; 00Ch
  125.     GetStride      dd ?   ; 010h
  126.     GetDataPointer dd ?   ; 014h
  127.     GetPixelFormat dd ?   ; 018h
  128. ends
  129.  
  130. ; GUID {6FDDC324-4E03-4BFE-B185-3D77768DC910}
  131. GUID_WICPixelFormat32bppPBGRA dd 06FDDC324h
  132.                               dw 04E03h
  133.                               dw 04BFEh
  134.                               db 0B1h, 085h, 03Dh, 077h, 076h, 08Dh, 0C9h, 010h
  135.  
  136. CLSCTX_INPROC_SERVER = 0x01
  137.  
  138. WICBitmapDitherTypeNone        = 0x00000000
  139. WICBitmapPaletteTypeCustom     = 0x00000000
  140. WICBitmapCacheOnDemand         = 0x00000001
  141. WICBitmapLockWrite             = 0x00000002
  142. WICDecodeMetadataCacheOnDemand = 0x00000000
Процесс загрузки изображения начинается с создания фабрики объектов типа IWICImagingFactory, с помощью которой мы в дальнейшем будем создавать декодеры, модификаторы и все прочие инструменты для работы. Тут ничего сложного, обычная работа с COM.

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

Встроенный браузер в приложении на Ассемблере

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

Встроенный браузер в приложении на Ассемблере

Сегодня будем рисовать свой браузер, а точнее внедрять фрейм web-браузера в интерфейс нашего приложения. Нечто подобное мы уже делали, но там были отдельные страницы, а сейчас полноценный браузер, встроенный в приложение. Языком исполнения, естественно, будет Ассемблер.

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

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