
Быстрый поиск
Введите фрагмент названия статьи для поиска
Принудительное обновление иконок в трее
12.01.2012 | Категория: Образ мышления: Assembler | Автор: ManHunter
В случае аварийного завершения или некорректной работы некоторых приложений, в системном трее могут оставаться "мертвые" иконки, которые уже не принадлежат ни одному запущенному процессу. Глюк хоть и не смертельный, но все равно неприятный. И основная проблема в том, что область трея никак не реагирует на внешние сообщения типа WM_REPAINT, и функции типа UpdateWindow и InvalidateRect. То есть автоматически обновить или перерисовать его, чтобы избавиться от "мертвых" иконок, не получится. Но такие иконки удаляются, если провести курсором мышки над ними. Значит единственный способ перерисовать иконки в трее - это сэмулировать движение мыши над окном трея. Как найти окно трея и его хэндл мы уже знаем, тут ничего нового. В сегменте данных те же значения:Code (Assembler) : Убрать нумерацию
- ; Сегмент данных
- section '.data' data readable writeable
- class1 db 'Shell_TrayWnd',0 ; Название класса окна трея
- class2 db 'TrayNotifyWnd',0 ; Название класса панели уведомлений
- class3 db 'SysPager',0 ; Трей
- class4 db 'ToolbarWindow32',0 ; Панель с иконками
- ToolbarHandle dd ? ; Хэндл окна трея
- ToolbarRect RECT ; Размер окна трея
Code (Assembler) : Убрать нумерацию
- ; Найти окно трея
- invoke FindWindow,class1,NULL
- or eax,eax
- jz exit_process
- ; Найти панель уведомлений
- invoke FindWindowEx,eax,NULL,class2,NULL
- or eax,eax
- jz exit_process
- ; Найти трей
- invoke FindWindowEx,eax,NULL,class3,NULL
- or eax,eax
- jz exit_process
- ; Найти панель иконок в трее
- invoke FindWindowEx,eax,NULL,class4,NULL
- or eax,eax
- jz exit_process
- ; Сохранить хэндл окна с иконками
- mov [ToolbarHandle],eax
Читать статью целиком »
Просмотров: 9183 | Комментариев: 21
Как узнать, что программа запущена под Администратором
20.11.2011 | Категория: Образ мышления: Assembler | Автор: ManHunter

Как узнать, что программа запущена под Администратором
Иногда требуется узнать, запущена ли ваша программа под учетной записью с правами Администратора, или же от обычного пользователя. Для чего это нужно? Например, некоторые операции с реестром или файлами требуют права Администратора. При попытке выполнить их обычному пользователю вернется ошибка ERROR_ACCESS_DENIED, но для более точного анализа ситуации надо будет проверить права доступа и уведомить об этом пользователя. Проверить, что программа запущена под Администратором, можно несколькими способами.
Читать статью целиком »
Просмотров: 11085 | Комментариев: 25
Диалог открытия файлов и юзабилити Windows
02.11.2011 | Категория: Образ мышления: Assembler | Автор: ManHunter
При всех удобствах Windows некоторые моменты меня очень сильно раздражают. Особенно поведение системы при вызове диалогов открытия файлов. Сперва немного предыстории. При работе с файлами через функцию GetOpenFileName или GetSaveFileName в структуре OPENFILENAME есть возможность указать путь, который должен открыться по умолчанию. Если это значение не задано, то система сама где-то запоминает папку, в которой последний раз был удачно открыт файл (то есть окно выбора файла было закрыто через кнопку "Ok"). Где именно хранится эта информация - я пока не выяснил, да и не особо надо. Второй вариант. Предположим, что некоторая программа самостоятельно запоминает путь к папке, в которой последний раз ею выполнялись какие-то действия с файлами. Это может быть, например, текстовый редактор, просмотрщик графики и т.п., не суть. Главное, что задумка очень хорошая и правильная. При следующем запуске или вызове диалога выбора файла в соответствующее поле OPENFILENAME будет подставлен сохраненный путь и пользователь продолжит работу с того места, где он в прошлый раз остановился. Что-то типа такого:Code (Assembler) : Убрать нумерацию
- ...
- invoke GetModuleHandle,0
- mov [ofn.hInstance],eax
- mov [ofn.lStructSize], sizeof.OPENFILENAME
- mov [ofn.hwndOwner],0
- mov [ofn.nMaxFile],MAX_PATH
- mov [ofn.lpstrFile],buff
- ; Открывать с последней сохраненной папки
- mov [ofn.lpstrInitialDir],saved_dir
- mov [ofn.Flags],OFN_EXPLORER+OFN_FILEMUSTEXIST
- invoke GetOpenFileName,ofn
- ...
Читать статью целиком »
Просмотров: 7503 | Комментариев: 6
Запуск консоли при установке Windows 7
31.07.2011 | Категория: Software | Автор: ManHunter

Запуск консоли при установке Windows 7
При установке Windows 7 с компакт-диска или загрузочной флешки есть возможность запустить консоль прямо из инсталлятора. Причем я говорю о запуске командной строки именно в процессе установки системы, а не после того, как Windows установлена и готова к работе. Для этого достаточно просто дождаться запуска инсталлятора (должно открыться окно выбора языка, региональных настроек и раскладки клавиатуры), а затем, начиная с этого момента, вы можете нажать комбинацию кнопок Shift+F10. Откроется окно с командной строкой.
Читать статью целиком »
Просмотров: 58597 | Комментариев: 18
Перезагрузка компьютера из командной строки
02.07.2011 | Категория: Software | Автор: ManHunter
В некоторых случаях требуется перезагрузить компьютер из командной строки, пакетного файла, через удаленный доступ или в автоматическим режиме без участия человека (например, через планировщик). В этом случае привычная комбинация меню "Пуск" - "Завершение работы", естественно, недоступна. Можно, конечно, воспользоваться сторонними утилитами различных разработчиков, скриптами AutoIt и другими вспомогательными средствами, но они могут быть не всегда доступны. Здесь я собрал несколько способов перезагрузки компьютера с использованием команд самой операционной системы. Некоторые из них работают только на определенных версиях Windows, а некоторые универсальные.Первая универсальная команда перезагрузки через shutdown, работающая на Windows XP и Windows 7. Параметры команды: -r - перезагрузка (reboot), -f - остановить все запущенные приложения, -t 0 - перезагрузить сразу же, без ожидания.
shutdown -t 0 -r -fВторая команда экзотичная, выполняется через команду ping. Работает также на Windows XP и Windows 7:
ping -n 0 127.0.0.1>nul&wmic OS WHERE Primary="TRUE" CALL Win32Shutdown 6Следующие две команды специфичны только для Windows XP. Эта работает на всех версиях Windows XP:
rundll32 user.exe,ExitWindowsExec 2А эта работает только до версии SP2 включительно. Останавливается служба журнала событий, после чего система автоматически уходит в перезагрузку. На более новых системах подобный фокус не срабатывает.
echo y|net stop eventlogСледующий метод перезагрузки самый громоздкий и основан на использовании скрипта VBS. Скрипт состоит из нескольких строчек, поэтому его придется создавать через команды консоли copy con имя_файла.vbs или через перенаправление вывода команды echo в файл. Зато сохраненный файл можно использовать в будущем. Такой способ подходит для Windows XP и Windows 7.
Читать статью целиком »
Просмотров: 124168 | Комментариев: 18


