Blog. Just Blog

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

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

Управление клавишами NumLock, CapsLock и ScrollLock

07.10.2009 | Категория: Образ мышления: Assembler | Автор: ManHunter
Иногда в программах требуется получать состояние управляющих клавиш или изменять их состояние. Во времена MS-DOS достаточно было просто прочитать или записать значение WORD по определенному адресу памяти, при этом светодиодные индикаторы клавиатуры реагировали на это включением или выключением. Были очень популярны крохотные, в несколько байт, программы для выключения NumLock при загрузке системы, типа таких:
  1. ;-----------------------------------------------------------
  2. ; Программа для выключения индикатора NumLock под MS-DOS
  3. ; Размер .com-файла после компиляции 9 байт
  4. ;-----------------------------------------------------------
  5. .286
  6. .model  tiny
  7. .code                         ; Сегмент кода
  8.         org     100h          ; Зарезервировано для PSP
  9. start:
  10.         pop     ax            ; После запуска в стеке 0, AX=0
  11.         mov     ds,ax         ; DS=0
  12.         mov     ds:[417h],ax  ; WORD DS:[417h] - состояние *Lock'ов
  13.         int     20h           ; Выход из программы
  14. end     start
В свое время это был самый минимальный рабочий код для выключения клавиши NumLock, хоть и не совсем корректный в плане работы со стеком.

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

CapsLock Killer 1.0

13.08.2009 | Категория: Мои программы | Автор: ManHunter

Скриншот программы CapsLock Killer

Программа предназначена для принудительного отключения клавиши CapsLock после нажатия, так что при активном CapsLock Killer клавиша CapsLock ведет себя как Shift. Программа была написана для личных нужд, когда мне надоело случайно попадать по кнопке CapsLock на своем ноутбуке. Во всяких интернетах для отключения клавиши CapsLock советуют разные радикальные методы вроде полной блокировки ее через реестр, установки монстрообразных менеджеров клавиатуры и прочие ужасы. CapsLock Killer не вносит в реестр никаких изменений, касающихся состояния управляющих клавиш, и может быть в любой момент отключен или удален без каких-либо последствий для системы. Управляется через иконку в трее или горячей клавишей Ctrl+Win+C, а через меню может добавляться в автозагрузку.

В программе использованы функции перехвата и обработки клавиатуры, поэтому некоторые "антивирусы" могут расценивать ее поведение как подозрительное. Я гарантирую, что никакого заведомо вредоносного кода CapsLock Killer не содержит.

Для оформления интерфейса программы использована картинка с сайта GarvGraphx.com, за что им большое спасибо.

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

ReadKey 1.0

02.04.2009 | Категория: Мои программы | Автор: ManHunter
Небольшая консольная программа для использования в пакетных файлах. Возвращает в %ERRORLEVEL% скан-код нажатой клавиши. Ее удобно применять, когда требуется запросить от пользователя какую-нибудь информацию, например подтверждение выбора Yes/No, букву диска, число от 0 до 9 и т.п. Для определения скан-кодов нужных вам клавиш в архиве прилагается файл scancodes.bat. Пример использования ReadKey:

@echo off
echo Example of usage ReadKey 1.0
:loop
echo Press [Y]es or [N]o:
readkey.exe
if %errorlevel% == 78 goto _no
if %errorlevel% == 89 goto _yes
:_error
echo Invalid Key!
goto loop
:_yes
echo Your choice is YES
goto _exit
:_no
echo Your choice is NO
:_exit
pause

Этот же пример в файле usage.bat из архива. В этом пакетном файле пользователя просят выбрать "Y" или "N" и, в зависимости от выбора, управление передается на разные ветки алгоритма.

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

Разбор параметров командной строки

03.03.2009 | Категория: Образ мышления: Assembler | Автор: ManHunter
Наконец-то добрался до полезной практической задачи по корректному разбору параметров командной строки. На языках высокого уровня это делается чуть ли не одной командой, а на Ассемблере как обычно приходится все делать самостоятельно. Решение получилось универсальным, подходит как для консольных, так и для GUI-приложений. Для использования функции ParseCmdLine в сегменте данных надо предварительно определить следующую структуру:
  1. ; Структура для командной строки
  2. struct  CMDLINE
  3.         nCount   dd ?   ; Количество аргументов
  4.         lpArgs   dd ?   ; Указатель на массив адресов строк
  5.         lpArgStr dd ?   ; Указатель на массив строк
  6. ends
Формат структуры: nCount - количество параметров командной строки, в случае успешного вызова функции это значение обязательно будет ненулевым, так как самый первый параметр - полный путь запуска программы, а остальные аргументы из хвоста командной строки будут расположены, начиная со второго элемента массива. lpArgStr - указатель на массив параметров командной строки. Все строки в этот массив записываются последовательно одна за другой в формате ASCIIZ, если строки были не в кавычках, то с начала и конца строки удаляются избыточные пробелы и символы табуляции. lpArgs - указатель на массив адресов разобранных параметров командной строки. Какого-то отдельного признака окончания массива не предусмотрено, количество элементов берется из значения nCount.

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

Программное выключение монитора

08.02.2009 | Категория: Образ мышления: Assembler | Автор: ManHunter
Выключить монитор из программы можно, но только если он совместим со стандартом EnergyStar. Об этом можно не беспокоиться, все современные мониторы удовлетворяют этому условию. Беспокоиться надо о другом. По непонятной причине с сайта на сайт упорно копируют один и тот же код на разных языках программирования, который якобы должен выключить монитор. Вот его вариант на Ассемблере:
  1. ; ВНИМАНИЕ! Это НЕПРАВИЛЬНЫЙ код!!!
  2. invoke  GetDesktopWindow
  3. invoke  SendMessage, eax, WM_SYSCOMMAND, SC_MONITORPOWER, 0
Во-первых, через хэндл из функции GetDesktopWindow достучаться до монитора не получится, причем ни в обычном Explorer'e, ни в альтернативных шеллах типа Aston Desktop. Чтобы сообщение дошло до нужного адресата, надо использовать широковещательную рассылку через HWND_BROADCAST. Во-вторых, непонятно откуда взялся последний параметр - 0. В MSDN четко прописано, что для выключения монитора через SC_MONITORPOWER значение lParam должно быть равно 2. Более того, нулевого значения параметра для этого сообщения вообще не предусмотрено. В двух строчках кода две принципиальные ошибки! И это уже далеко не первый случай, когда код из различных популярных источников является заведомо нерабочим. Всем любителям бездумного копипаста очень рекомендую сперва сверяться с первоисточниками, а перед публикацией проверять весь код на практике.

Но хватит о грустном. Правильный код программного выключения монитора будет таким:
  1. ;-------------------------------------------------
  2. ; Правильный код выключения монитора
  3. ;-------------------------------------------------
  4. ; В FASM не определена константа HWND_BROADCAST, сделаем это самостоятельно
  5. HWND_BROADCAST = 0FFFFh
  6. ; Выключить монитор
  7. invoke  SendMessage, HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, 2
Для включения монитора обратно достаточно пошевелить мышкой или нажать любую кнопку на клавиатуре. А можно также сделать это из нашей программы. У копипастеров этот код также содержит ошибку, потому что для включения монитора значение lParam должно быть равно -1, а не 1.

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

Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2019
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.11 сек. / MySQL: 3 (0.042 сек.) / Память: 4.75 Mb
Наверх