Blog. Just Blog

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

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

Отключение кнопки "Свернуть все окна" в Windows 7

03.06.2010 | Категория: Образ мышления: Assembler | Автор: ManHunter
Захотелось поэкспериментировать с новым интерфейсом Windows 7, а конкретно решил убрать кнопку "Свернуть все окна" из трея. Зачем мне это надо - вопрос другой, здесь важна сама реализация. Кнопка "Свернуть все окна", как в сказке про Кащея, находится внутри нескольких других окон. Вложенность и иерархию классов можно определить, например, при помощи программы WinDowzer или любой другой, показывающей дерево всех окон системы. Для поиска родительского окна системного трея с названием класса Shell_TrayWnd я использовал функцию FindWindow, а для определения хэндлов вложенных дочерних окон с классами TrayNotifyWnd (область уведомлений) и TrayShowDesktopButtonWClass (сама кнопка "Свернуть все окна") - функцию FindWindowEx.
  1.         ...
  2.         ; Найти окно трея
  3.         invoke  FindWindow,stw,NULL
  4.         or      eax,eax
  5.         jz      no_button
  6.  
  7.         ; Найти окно уведомлений в трее
  8.         invoke  FindWindowEx,eax,NULL,tnw,NULL
  9.         or      eax,eax
  10.         jz      no_button
  11.  
  12.         ; Найти кнопку "Свернуть все окна"
  13.         invoke  FindWindowEx,eax,NULL,tsc,NULL
  14.         or      eax,eax
  15.         jz      no_button
  16.  
  17.         ; Спрятать кнопку "Свернуть все окна"
  18.         ; Если надо показать кнопку, то замените флаг на SW_SHOW
  19.         invoke  ShowWindow,eax,SW_HIDE
  20.  
  21.         ; Кнопка не найдена
  22. no_button:
  23.         ...
  24.  
  25. ; Названия классов окон для поиска
  26. stw     db      'Shell_TrayWnd',0  ; Название класса окна трея
  27. tnw     db      'TrayNotifyWnd',0  ; Название класса окна области уведомлений
  28. tsc     db      'TrayShowDesktopButtonWClass',0  ; Название окна кнопки
К сожалению, мне не удалось полностью убрать кнопку из трея, даже когда она скрыта, на ее месте остается пустое пространство. Попытки изменить ширину кнопки перед ее скрытием при помощи функции SetWindowPos успеха тоже не принесли.

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

Еще один генератор случайных чисел на Ассемблере

17.05.2010 | Категория: Образ мышления: Assembler | Автор: ManHunter
В закромах Родины нашлась реализация еще одного генератора случайных чисел. Он более громоздкий, чем минимальный генератор Парка-Миллера, использует операции с плавающей точкой и кольцевой буфер, но результаты выдает гораздо лучше. Кроме большого кода ему также требуется больше места и в сегменте данных:
  1. section '.data' data readable writeable
  2.  
  3. ; Данные для генератора случайных чисел
  4. JJ      =       10             ; lag 1
  5. KK      =       17             ; lag 2, size of circular buffer
  6. R1      =       19             ; rotate count
  7. R2      =       27             ; rotate count
  8. randp1  dt      1.5            ; used for conversion to float
  9.         dw      0              ; alignment
  10. p1      dd      0              ; pointer in circular buffer
  11. p2      dd      0              ; pointer in circular buffer
  12. randbuf dd      (2*KK) dup(?)  ; circular buffer
Перед первым использованием генератор требуется инициализировать, вызвав функцию WRandomInit с каким-нибудь случайным значением, например, количеством тиков таймера:
  1.         ; Инициализация генератора случайных чисел
  2.         invoke  GetTickCount
  3.         stdcall WRandomInit,eax
  4.         ...
После инициализации генератор можно использовать в двух режимах: генерация одиночного случайного числа размером в два двойных слова (функция WRandom) или генерация случайного числа в заданном диапазоне от 1 до 0FFFFFFFEh (функция WIRandom). Формулировка "одиночное случайное число", наверное, не совсем подходит по смыслу к выполняемому действию, но тавтология "произвольное случайное число" мне показалась хуже.

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

Создание анимированной иконки приложения

24.04.2010 | Категория: Образ мышления: Assembler | Автор: ManHunter
Очередная милая рюшечка для украшения программ - анимированная иконка. Она может быть как в заголовке окна, так и в системном трее. Кроме чисто декоративной функции анимация часто используется и в полезных целях, например, почтовая программа TheBat! таким способом оповещает, что пришло новое письмо, качалка Download Master показывает свою активность при загрузке файлов, антивирусы обозначают процесс сканирования файлов, ICQ крутит "цветочек" при подключении, ну и так далее. Реальных примеров на самом деле много.

Для всех вариантов анимации сперва надо подготовить исходный материал. Это должны быть иконки одинакового размера, представляющие собой отдельные кадры анимации. У меня это будет вращающийся смайлик. Художник из меня никудышный, поэтому я просто взял и повернул готовый смайлик нужное количество раз на 45 градусов по часовой стрелке.


Кадры для анимации

В ресурсах иконки лучше всего описывать номерными индексами. Обратите внимание, что индексы иконок идут по порядку, так будет гораздо легче работать с ними:
  1. resource group_icons,\
  2.            1,LANG_NEUTRAL,animate1,\
  3.            2,LANG_NEUTRAL,animate2,\
  4.            3,LANG_NEUTRAL,animate3,\
  5.            4,LANG_NEUTRAL,animate4,\
  6.            5,LANG_NEUTRAL,animate5,\
  7.            6,LANG_NEUTRAL,animate6,\
  8.            7,LANG_NEUTRAL,animate7,\
  9.            8,LANG_NEUTRAL,animate8
  10.  
  11. resource icons,\
  12.            1,LANG_NEUTRAL,icon_data1,\
  13.            2,LANG_NEUTRAL,icon_data2,\
  14.            3,LANG_NEUTRAL,icon_data3,\
  15.            4,LANG_NEUTRAL,icon_data4,\
  16.            5,LANG_NEUTRAL,icon_data5,\
  17.            6,LANG_NEUTRAL,icon_data6,\
  18.            7,LANG_NEUTRAL,icon_data7,\
  19.            8,LANG_NEUTRAL,icon_data8
  20.  
  21. icon animate1,icon_data1,'icon1.ico'
  22. icon animate2,icon_data2,'icon2.ico'
  23. icon animate3,icon_data3,'icon3.ico'
  24. icon animate4,icon_data4,'icon4.ico'
  25. icon animate5,icon_data5,'icon5.ico'
  26. icon animate6,icon_data6,'icon6.ico'
  27. icon animate7,icon_data7,'icon7.ico'
  28. icon animate8,icon_data8,'icon8.ico'
Теперь рассмотрим оба варианта анимированных иконок.

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

Построение карты памяти процесса

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

Для построения карты памяти процесса используется функция VirtualQueryEx и специальная структура MEMORY_BASIC_INFORMATION. В FASM она как обычно не определена, придется сделать это самостоятельно в сегменте данных:
  1. ; Структура для чтения памяти процесса
  2. struct  MEMORY_BASIC_INFORMATION
  3.         BaseAddress          dd ?
  4.         AllocationBase       dd ?
  5.         AllocationProtect    dd ?
  6.         RegionSize           dd ?
  7.         State                dd ?
  8.         Protect              dd ?
  9.         Type                 dd ?
  10. ends
  11.  
  12. ; Структура для чтения памяти процесса
  13. mbi             MEMORY_BASIC_INFORMATION
Для работы с памятью процесса при помощи функции VirtualQueryEx нам надо знать хэндл этого процесса. Для дочерних, которые мы запустили сами, все просто: это значение hProcess из структуры PROCESS_INFORMATION. Если процесс порожден не нами, то для получения его хэндла, зная ID процесса, надо воспользоваться функцией OpenProcess, обязательно с флагом PROCESS_QUERY_INFORMATION. Возможно, что перед этим потребуется повысить привилегии нашего процесса, активировав SeDebugPrivilege.

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

Создание и обработка улучшенного MessageBox

19.03.2010 | Категория: Образ мышления: Assembler | Автор: ManHunter
В одной из прошлых статей мы уже научились обрабатывать и облагораживать окно выбора каталога, а теперь сделаем что-нибудь необычное и противоестественное с окном сообщения MessageBox. Первое, что приходит на ум - это описать аналог MessageBox в ресурсах или создавать его динамически по мере надобности, но это получается как-то слишком просто. Попробуем перехватить стандартное окно MessageBox в момент создания. Для этого поставим хук на текущий тред нашего процесса, хук должен иметь тип WH_CBT:
  1.         ...
  2.         ; Получить хэндл текущего потока
  3.         invoke  GetCurrentThreadId
  4.         ; Установить перехватчик событий
  5.         invoke  SetWindowsHookEx,WH_CBT,MBHookProc,NULL,eax
  6.         ; Сохранить хэндл хука
  7.         mov     [hMBHook],eax
  8.         ...
Теперь мы можем отследить и обработать момент, когда система захочет активировать любое окно, принадлежащее треду. Значит, если сразу после установки этого хука вызвать функцию MessageBox, то перехватчик также получит управление и мы сможем получить хэндл окна создаваемого MessageBox. В сегменте данных определим нужные переменные, структуры и строки. Их назначение будет раскрыто дальше.
  1. section '.date' data readable writeable
  2.  
  3. ; Заголовок и текст окна
  4. szTitle         db 'Hello!',0
  5. szMess          db 'This is a Customized MessageBox with long text!',13,10
  6.                 db 'FASM is the BEST Assembler!',0
  7.  
  8. ; Новый текст на кнопках
  9. szButt1         db 'Of Course ;)',0
  10. szButt2         db 'No-no-no!!!',0
  11.  
  12. ; Название класса окна
  13. cname           db 'EDIT',0
  14.  
  15. hMBHook         dd ?    ; Хэндл хука
  16. pOldProc        dd ?    ; Адрес старого обработчика окна
  17. hInstance       dd ?    ; Хэндл модуля
  18. hHeap           dd ?    ; Хэндл кучи
  19. hMemory         dd ?    ; Указатель на память
  20. coord           RECT    ; Размеры текста
Зная хэндл, с окном можно сделать практически все что угодно. Здесь есть важный момент: после обработки окна надо обязательно сразу же снять хук, чтобы не было никаких накладок.

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

01 ... 61 62 63 64 65 66 67 ... 73
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.1 сек. / MySQL: 3 (0.0187 сек.) / Память: 4.5 Mb
Наверх