
Быстрый поиск
Введите фрагмент названия статьи для поиска
Windows 7 Taskbar API на Ассемблере
30.06.2010 | Категория: Образ мышления: Assembler | Автор: ManHunter

Progress Bars и Overlay Icons
Продолжаю потихоньку осваивать внутренности Windows 7. В новой системе появилась такая приятная фича интерфейса, как отображение прогресса выполнения какого-нибудь действия прямо на кнопке приложения в панели задач. Впервые я увидел это в программе Total Commander при копировании и переносе файлов, сразу очень захотелось узнать как это делается и научиться делать самому. К сожалению, во всех доступных мне интернетах были найдены только примеры для Delphi, .NET и прочих языков высокого уровня. Пришлось лезть в отладчик и запасаться железным терпением, зато в результате получилось вполне рабочее решение. Для управления элементами панели задач в Windows 7 используется COM-интерфейс ITaskBarList3. Как обычно, никаких описаний в FASM нет, и все необходимое нужно искать самому или портировать с других языков.
Code (Assembler) : Убрать нумерацию
- ; GUID {56FDF344-FD6D-11D0-958A-006097C9A090}
- CLSID_TaskbarList dd 056FDF344h
- dw 0FD6Dh
- dw 011D0h
- db 095h, 08Ah, 000h, 060h, 097h, 0C9h, 0A0h, 090h
- ; GUID {EA1AFB91-9E28-4B86-90E9-9E9F8A5EEFAF}
- IID_ITaskbarList3 dd 0EA1AFB91h
- dw 09E28h
- dw 04B86h
- db 090h, 0E9h, 09Eh, 09Fh, 08Ah, 05Eh, 0EFh, 0AFh
- ; ITaskbarList3 Interface
- SetProgressValue = 4*09
- SetProgressState = 4*10
- RegisterTab = 4*11
- UnregisterTab = 4*12
- SetTabOrder = 4*13
- SetTabActive = 4*14
- ThumbBarAddButtons = 4*15
- ThumbBarUpdateButtons = 4*16
- ThumbBarSetImageList = 4*17
- SetOverlayIcon = 4*18
- SetThumbnailTooltip = 4*19
- SetThumbnailClip = 4*20
- ; Типы прогрессбаров на панели задач
- TBPF_NOPROGRESS = 0
- TBPF_INDETERMINATE = 1
- TBPF_NORMAL = 2
- TBPF_ERROR = 4
- TBPF_PAUSED = 8
- ; Константы для работы с объектом
- CLSCTX_INPROC_SERVER = 1
- S_OK = 0
Читать статью целиком »
Просмотров: 8537 | Комментариев: 11
Отключение кнопки "Свернуть все окна" в Windows 7
03.06.2010 | Категория: Образ мышления: Assembler | Автор: ManHunter
Захотелось поэкспериментировать с новым интерфейсом Windows 7, а конкретно решил убрать кнопку "Свернуть все окна" из трея. Зачем мне это надо - вопрос другой, здесь важна сама реализация. Кнопка "Свернуть все окна", как в сказке про Кащея, находится внутри нескольких других окон. Вложенность и иерархию классов можно определить, например, при помощи программы WinDowzer или любой другой, показывающей дерево всех окон системы. Для поиска родительского окна системного трея с названием класса Shell_TrayWnd я использовал функцию FindWindow, а для определения хэндлов вложенных дочерних окон с классами TrayNotifyWnd (область уведомлений) и TrayShowDesktopButtonWClass (сама кнопка "Свернуть все окна") - функцию FindWindowEx.Code (Assembler) : Убрать нумерацию
- ...
- ; Найти окно трея
- invoke FindWindow,stw,NULL
- or eax,eax
- jz no_button
- ; Найти окно уведомлений в трее
- invoke FindWindowEx,eax,NULL,tnw,NULL
- or eax,eax
- jz no_button
- ; Найти кнопку "Свернуть все окна"
- invoke FindWindowEx,eax,NULL,tsc,NULL
- or eax,eax
- jz no_button
- ; Спрятать кнопку "Свернуть все окна"
- ; Если надо показать кнопку, то замените флаг на SW_SHOW
- invoke ShowWindow,eax,SW_HIDE
- ; Кнопка не найдена
- no_button:
- ...
- ; Названия классов окон для поиска
- stw db 'Shell_TrayWnd',0 ; Название класса окна трея
- tnw db 'TrayNotifyWnd',0 ; Название класса окна области уведомлений
- tsc db 'TrayShowDesktopButtonWClass',0 ; Название окна кнопки
Читать статью целиком »
Просмотров: 25139 | Комментариев: 32
Еще один генератор случайных чисел на Ассемблере
17.05.2010 | Категория: Образ мышления: Assembler | Автор: ManHunter
В закромах Родины нашлась реализация еще одного генератора случайных чисел. Он более громоздкий, чем минимальный генератор Парка-Миллера, использует операции с плавающей точкой и кольцевой буфер, но результаты выдает гораздо лучше. Кроме большого кода ему также требуется больше места и в сегменте данных:Code (Assembler) : Убрать нумерацию
- section '.data' data readable writeable
- ; Данные для генератора случайных чисел
- JJ = 10 ; lag 1
- KK = 17 ; lag 2, size of circular buffer
- R1 = 19 ; rotate count
- R2 = 27 ; rotate count
- randp1 dt 1.5 ; used for conversion to float
- dw 0 ; alignment
- p1 dd 0 ; pointer in circular buffer
- p2 dd 0 ; pointer in circular buffer
- randbuf dd (2*KK) dup(?) ; circular buffer
Code (Assembler) : Убрать нумерацию
- ; Инициализация генератора случайных чисел
- invoke GetTickCount
- stdcall WRandomInit,eax
- ...
Читать статью целиком »
Просмотров: 11864 | Комментариев: 10
Создание анимированной иконки приложения
24.04.2010 | Категория: Образ мышления: Assembler | Автор: ManHunter
Очередная милая рюшечка для украшения программ - анимированная иконка. Она может быть как в заголовке окна, так и в системном трее. Кроме чисто декоративной функции анимация часто используется и в полезных целях, например, почтовая программа TheBat! таким способом оповещает, что пришло новое письмо, качалка Download Master показывает свою активность при загрузке файлов, антивирусы обозначают процесс сканирования файлов, ICQ крутит "цветочек" при подключении, ну и так далее. Реальных примеров на самом деле много.Для всех вариантов анимации сперва надо подготовить исходный материал. Это должны быть иконки одинакового размера, представляющие собой отдельные кадры анимации. У меня это будет вращающийся смайлик. Художник из меня никудышный, поэтому я просто взял и повернул готовый смайлик нужное количество раз на 45 градусов по часовой стрелке.
Кадры для анимации
В ресурсах иконки лучше всего описывать номерными индексами. Обратите внимание, что индексы иконок идут по порядку, так будет гораздо легче работать с ними:
Code (Assembler) : Убрать нумерацию
- resource group_icons,\
- 1,LANG_NEUTRAL,animate1,\
- 2,LANG_NEUTRAL,animate2,\
- 3,LANG_NEUTRAL,animate3,\
- 4,LANG_NEUTRAL,animate4,\
- 5,LANG_NEUTRAL,animate5,\
- 6,LANG_NEUTRAL,animate6,\
- 7,LANG_NEUTRAL,animate7,\
- 8,LANG_NEUTRAL,animate8
- resource icons,\
- 1,LANG_NEUTRAL,icon_data1,\
- 2,LANG_NEUTRAL,icon_data2,\
- 3,LANG_NEUTRAL,icon_data3,\
- 4,LANG_NEUTRAL,icon_data4,\
- 5,LANG_NEUTRAL,icon_data5,\
- 6,LANG_NEUTRAL,icon_data6,\
- 7,LANG_NEUTRAL,icon_data7,\
- 8,LANG_NEUTRAL,icon_data8
- icon animate1,icon_data1,'icon1.ico'
- icon animate2,icon_data2,'icon2.ico'
- icon animate3,icon_data3,'icon3.ico'
- icon animate4,icon_data4,'icon4.ico'
- icon animate5,icon_data5,'icon5.ico'
- icon animate6,icon_data6,'icon6.ico'
- icon animate7,icon_data7,'icon7.ico'
- icon animate8,icon_data8,'icon8.ico'
Читать статью целиком »
Просмотров: 10788 | Комментариев: 14
Построение карты памяти процесса
02.04.2010 | Категория: Образ мышления: Assembler | Автор: ManHunter

Построение карты памяти процесса
Умение работать с памятью сторонних процессов - полезный навык адепта Темной стороны Силы. Таким способом можно найти нужные данные, хранящиеся в памяти, например, расшифрованные файлы, изображения, пароли, и еще много чего вкусного. Также этот навык пригодится при создании распаковщиков, лоадеров для программ и трейнеров для различных игр. Я привел лишь несколько примеров, на практике их можно найти гораздо больше.
Читать статью целиком »
Просмотров: 9392 | Комментариев: 8

