Быстрый поиск
Введите фрагмент названия статьи для поиска
Восстановление иконки в трее после сбоя системы
02.03.2010 | Категория: Образ мышления: Assembler | Автор: ManHunter
Если ваше приложение создает и использует свою иконку в трее, то в обязательном порядке надо обрабатывать ситуацию, когда по какой-либо причине произошел сбой и перезапуск Explorer'а. В этом случае перерисовывается панель задач, рабочий стол, системный трей со значками и т.д., и если вы не вернете свою иконку в трей, то она "потеряется". При аварийном перезапуске Explorer'а всем окнам (HWND_BROADCAST) системой отсылается сообщение TaskbarCreated. Особенность этого сообщения в том, что оно не имеет постоянного значения идентификатора, и его значение должно быть получено функцией RegisterWindowMessage. В описаниях этой функции сказано, что она используется для регистрации уникального системного сообщения, но почему-то нигде не указано, что если такое сообщение уже зарегистрировано в системе, то функцией возвращается его существующий идентификатор. Это полезное свойство мы и будем использовать.Code (Assembler) : Убрать нумерацию
- ; Сегмент данных
- ...
- szTBC db 'TaskbarCreated',0 ; Имя сообщения
- restore_msg dd ? ; Идентификатор сообщения TaskbarCreated
- ...
Code (Assembler) : Убрать нумерацию
- ; Сегмент кода
- ...
- ; Зарегистрировать сообщение TaskbarCreated
- invoke RegisterWindowMessage,szTBC
- mov [restore_msg],eax
- ...
Code (Assembler) : Убрать нумерацию
- ...
- ; Сообщение TaskbarCreated?
- mov eax,[msg]
- cmp eax,[restore_msg]
- je .wmrestore
- ...
- .wmrestore:
- ; Восстановить иконку в трее
- invoke Shell_NotifyIcon, NIM_ADD, node
- jmp .processed
- ...
Читать статью целиком »
Просмотров: 7475 | Комментариев: 4
Тюнинг функции SHBrowseForFolder
10.02.2010 | Категория: Образ мышления: Assembler | Автор: ManHunter
Функция API SHBrowseForFolder предназначена для выбора какой-нибудь папки из дерева каталогов всех дисков системы. Со своей задачей она, в принципе, справляется неплохо, но имеет ряд недостатков: окно выбора открывается в произвольных местах экрана, нельзя задать начальный каталог, нельзя менять заголовок окна и т.п. Если посмотреть внимательно на структуру BROWSEINFO, которую функция использует в работе, то в ней обнаруживается интересный параметр - указатель на callback-функцию BrowseCallbackProc. Эта функция получает управление при возникновении различных событий в окне выбора папок. Попробуем с ее помощью немного расширить базовый функционал SHBrowseForFolder. Сперва в сегменте данных определим необходимые значения для создания самого диалога выбора.Code (Assembler) : Убрать нумерацию
- ; Описание структуры BROWSEINFO
- struct BROWSEINFO
- hwndOwner dd ?
- pidlRoot dd ?
- pszDisplayName dd ?
- lpszTitle dd ?
- ulFlags dd ?
- lpfn dd ?
- lParam dd ?
- iImage dd ?
- ends
- ; Структура для работы с папками
- bi BROWSEINFO
- ; Буфер, который получит выбранных путь
- szDisplayName rb MAX_PATH
- ; Текст подсказки в окне выбора папки
- szTitle db 'Please select folder',0
Code (Assembler) : Убрать нумерацию
- ...
- ; Заполнить структуру
- mov [bi.hwndOwner],NULL
- mov [bi.ulFlags],BIF_RETURNONLYFSDIRS+BIF_DONTGOBELOWDOMAIN
- mov [bi.pszDisplayName],szDisplayName
- mov [bi.lpszTitle],szTitle
- ; Указатель на callback-функцию
- mov [bi.lpfn],BrowseCallbackProc
- ; Открыть диалог выбора папки
- invoke SHBrowseForFolder,bi
- ...
Читать статью целиком »
Просмотров: 9232 | Комментариев: 5
Установка окна по центру экрана
05.01.2010 | Категория: Образ мышления: Assembler | Автор: ManHunter
Для того, чтобы создаваемое диалоговое окно отображалось в самом центре экрана, его надо создать с атрибутом стиля DS_CENTER. Но иногда требуется отцентровать уже созданное или чужое окно. Для этого я написал небольшую функцию, устанавливающую выбранное окно по центру экрана, с некоторыми дополнительными возможностями. Функция самодостаточна, не требует дополнительных переменных в сегменте данных, корректно работает с любыми окнами, пропуская развернутые на весь экран.Code (Assembler) : Убрать нумерацию
- ;-------------------------------------------------------------------------
- ; Процедура перемещения окна в центр экрана. Если окно развернуто или
- ; его размеры превышают размеры экрана, то окно не перемещается
- ; Параметры:
- ; hwnd - хэндл окна
- ; mode - относительно каких координат центровать окно (1 - только
- ; рабочая область экрана с учетом размеров панели задач и
- ; различных тулбаров, 0 - относительно размеров всего экрана)
- ;-------------------------------------------------------------------------
- proc WindowToCenter hwnd:DWORD, mode:DWORD
- ; Локальные переменные, они же структура RECT
- local left :DWORD
- local top :DWORD
- local right :DWORD
- local bottom :DWORD
- ; Сохранить все регистры
- pusha
- ; Такое окно существует?
- invoke IsWindow,[hwnd]
- or eax,eax
- jz .loc_ret
- ; Окно развернуто на весь экран?
- invoke IsZoomed,[hwnd]
- or eax,eax
- jnz .loc_ret
- ; Получить размеры окна
- lea eax,[left]
- invoke GetWindowRect,[hwnd],eax
- ; Флаги функции SetWindowPos
- push SWP_NOSIZE+SWP_NOZORDER
- push NULL
- push NULL
- ; Какие размеры экрана получать
- mov eax,SM_CYSCREEN ; Вся экранная область
- cmp [mode],0
- je @f
- mov eax,SM_CYFULLSCREEN ; Рабочая область экрана
- @@:
- ; Получить высоту экрана
- invoke GetSystemMetrics,eax
- mov ecx,[bottom]
- sub ecx,[top]
- ; Высота окна больше высоты экрана?
- cmp ecx,eax
- jbe @f
- ; Почистить стек и на выход
- add esp,12
- jmp .loc_ret
- @@:
- sub eax,ecx
- shr eax,1
- ; Новая координата Y
- push eax
- ; Какие размеры экрана получать
- mov eax,SM_CXSCREEN ; Вся экранная область
- cmp [mode],0
- je @f
- mov eax,SM_CXFULLSCREEN ; Рабочая область экрана
- @@:
- ; Получить ширину экрана
- invoke GetSystemMetrics,eax
- mov ecx,[right]
- sub ecx,[left]
- ; Ширина окна больше ширины экрана?
- cmp ecx,eax
- jbe @f
- ; Почистить стек и на выход
- add esp,16
- jmp .loc_ret
- @@:
- sub eax,ecx
- shr eax,1
- ; Новая координата X
- push eax
- ; Разместить окно по центру экрана
- invoke SetWindowPos,[hwnd],NULL
- .loc_ret:
- ; Восстановить все регистры
- popa
- ret
- endp
Читать статью целиком »
Просмотров: 8693 | Комментариев: 4
Эффект бегущей строки на Ассемблере
14.12.2009 | Категория: Образ мышления: Assembler | Автор: ManHunter
Очередной интересный визуальный эффект для ваших программ - бегущая строка. Обычно подобный эффект используется в различных кейгенах, но вполне может пригодиться и для более мирных приложений. В качестве основы взята ассемблерная библиотека Scroller lib 1.01 от ReWolf / HTBTeam. Изначально она предназначалась для MASM, так что пришлось ее портировать под FASM. В процессе переноса библиотека была немного переработана и дополнена, а также упрощена ее структура и подключение к проектам. Сперва в сегменте данных определяются вспомогательные константы и структура для создания скроллера.Code (Assembler) : Убрать нумерацию
- ; Константы, определяющие режим скроллера
- SCROLL_START = 0 ; Скроллер запущен
- SCROLL_PAUSE = 1 ; Скроллер на паузе
- SCROLL_STOP = 2 ; Скроллер полностью остановлен
- ; Структура для скроллера
- struct SCROLLSTRUCT
- ; Значения заполняются пользователем
- hwDlg dd ? ; Хэндл окна для скроллера
- hFont dd ? ; Шрифт скроллера
- ddWidth dd ? ; Ширина скроллера
- X dd ? ; Координата X
- Y dd ? ; Координата Y
- lpstrText dd ? ; Строка скроллера ASCIIZ
- ddTxtColor dd ? ; Цвет текста скроллера
- ddBkgColor dd ? ; Цвет фона скроллера
- ddSpeed dd ? ; Скорость движения
- dbMode db ? ; Режим скроллера
- ; Внутренние переменные
- ddROP dd ?
- hBkgDC dd ?
- hTxtBmp dd ?
- hTmpBmp dd ?
- hBakTmpBmp dd ?
- hInDC dd ?
- ddHeight dd ?
- ddPos dd ?
- ddTxtWidth dd ?
- ends
Читать статью целиком »
Просмотров: 8409 | Комментариев: 5
Диалоговые окна из html-файлов на Ассемблере
29.11.2009 | Категория: Образ мышления: Assembler | Автор: ManHunter
Использование html-файлов для создания диалоговых окон применяется чаще всего в качестве сплэш-скринов разных триальных защит (первое, что приходит на память - протектор Armadillo и wrapper'ы от различных игровых дистрибьюторов) или в некоторых "демонстрашках", использующих графические эффекты. Плюсов тут много: вместо кропотливой низкоуровневой обработки шрифтов и цветных символов, визуальных эффектов и картинок, достаточно все это описать обычным CSS и HTML-тегами в HTML-странице, а с помощью скриптов JavaScript добавить нужную интерактивность. Кроме этого можно вынести из основного программного кода часть каких-нибудь зубодробильных вычислений на JavaScript, а потом передать результат основному приложению. У меня, например, по такому принципу написана новая версия Eval JavaScript Unpacker.Для создания окна сперва надо определить в сегменте данных некоторые значения. Главные из них - имя HTML-файла и параметры открываемого окна.
Code (Assembler) : Убрать нумерацию
- ; Сегмент данных
- section '.data' data readable writeable
- szRes du 'res://',0
- lenRes = $-szRes-2
- szName du '/htmldialog.html',0 ; Имя html-файла в ресурсах
- szParam du 'dialogWidth:350px;dialogHeight:200px;help:off;',0
- hMoniker dd ? ; Хэндл моникера
- szUrl rb 200h ; Путь к основному файлу
Читать статью целиком »
Просмотров: 6870 | Комментариев: 28