![Blog. Just Blog](/images/logo.png)
Быстрый поиск
Введите фрагмент названия статьи для поиска
![](/images/dot.gif)
Восстановление иконки в трее после сбоя системы
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
- ...
Читать статью целиком »
Просмотров: 7566 | Комментариев: 4
![](/images/dot.gif)
Тюнинг функции 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
- ...
Читать статью целиком »
Просмотров: 9339 | Комментариев: 5
![](/images/dot.gif)
Flying Windows 1.6
03.02.2010 | Категория: Мои программы | Автор: ManHunter
![](/upload/4f/6d/4f6d0d958fbca4f6da43f47383a0f8f9.png)
Скриншот программы Flying Windows
Эта маленькая программа значительно облегчает работу за компьютером. Написана для личных нужд и включает в себя несколько полезных инструментов:
1. Flying windows
При включенной опции можно перетаскивать при нажатой клавише Alt любое окно за любое место, а не только за заголовок. Очень удобно, когда одновременно открыто много окон или панелей инструментов. В некоторых приложениях дает неожиданный эффект, перетаскивая вместо окна его дочерние элементы. Но это случается крайне редко, мне пока встретилось всего несколько таких программ.
2. Intelligent mousewheel
Эта опция дает возможность прокрутки окон колесиком мышки без установки на них фокуса. Опять же удобно когда открыто много окон.
3. Enabler and unhider
Эта опция позволяет открывать пароли за "звездочками", активировать отключенные кнопки, поля ввода, убирает лимиты количества символов с полей ввода, в качестве побочного эффекта "отвязывает" любые открытые модальные окна. Открытие паролей работает не во всех приложениях. Опция включается через меню или нажатием колесика мыши на иконке в трее. Отключается нажатием колесика мыши на главной иконке в трее или любым нажатием на собственную иконку Enabler'а. Настоятельно не рекомендуется держать Enabler постоянно включенным! Это связано с тем, что создается дополнительная нагрузка на систему и некоторые программы могут работать нестабильно. Также принудительная разблокировка всех подряд элементов во всех окнах может привести, например, к такой ситуации: вы поставите галочку в настройках какой-нибудь программы, а потом окажется что она изначально была заблокирована и взаимосвязана с другой настройкой. К чему это в результате может привести остается только догадываться.
Читать статью целиком »
Просмотров: 45417 | Комментариев: 70
![](/images/dot.gif)
Проверка и обнаружение зависших приложений
27.10.2009 | Категория: Образ мышления: Assembler | Автор: ManHunter
Иногда для работы требуется определение зависших приложений, окна которых не отвечают на сообщения. Для этого есть два способа. Первый - официально документированный, через функцию SendMessageTimeOut. Особенность ее работы заключается в том, что после отправки сообщения окну она ждет ответ заданное время, и, если ответа от приложения не последовало, то возвращает FALSE. Вот пример использования функции. Нужные константы, как обычно, в FASM не определены, пришлось брать их из других источников.Code (Assembler) : Убрать нумерацию
- ...
- ; Определить таймаут 50 миллисекунд
- TIMEOUT = 50
- ; Определить константу SMTO_ABORTIFHUNG
- SMTO_ABORTIFHUNG = 2
- ; hwnd - хэндл проверяемого окна
- invoke SendMessageTimeout,[hwnd],NULL,0,0,SMTO_ABORTIFHUNG,TIMEOUT,NULL
- ; Если вернулся 0, то приложение "висит"
- or eax,eax
- jz app_hung_up
- ...
Читать статью целиком »
Просмотров: 8366 | Комментариев: 2
![](/images/dot.gif)
Управление клавишами NumLock, CapsLock и ScrollLock
07.10.2009 | Категория: Образ мышления: Assembler | Автор: ManHunter
Иногда в программах требуется получать состояние управляющих клавиш или изменять их состояние. Во времена MS-DOS достаточно было просто прочитать или записать значение WORD по определенному адресу памяти, при этом светодиодные индикаторы клавиатуры реагировали на это включением или выключением. Были очень популярны крохотные, в несколько байт, программы для выключения NumLock при загрузке системы, типа таких:Code (Assembler) : Убрать нумерацию
- ;-----------------------------------------------------------
- ; Программа для выключения индикатора NumLock под MS-DOS
- ; Размер .com-файла после компиляции 9 байт
- ;-----------------------------------------------------------
- .286
- .model tiny
- .code ; Сегмент кода
- org 100h ; Зарезервировано для PSP
- start:
- pop ax ; После запуска в стеке 0, AX=0
- mov ds,ax ; DS=0
- mov ds:[417h],ax ; WORD DS:[417h] - состояние *Lock'ов
- int 20h ; Выход из программы
- end start
Читать статью целиком »
Просмотров: 13319 | Комментариев: 3
![](/images/dot.gif)