
Управление клавишами NumLock, CapsLock и ScrollLock
Иногда в программах требуется получать состояние управляющих клавиш или изменять их состояние. Во времена 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
В среде Windows все значительно усложнилось. Теперь получать состояние переключателей приходится при помощи функции GetKeyState. Для изменения состояния клавиш в Windows есть функция SetKeyboardState, но она не меняет состояния светодиодов на клавиатуре. Поэтому придется искать другой путь, например, через функцию keybd_event эмулировать нажатия на соответствующие клавиши. Для удобства я написал небольшую функцию, устанавливающую нужный переключатель в нужное состояние.
Code (Assembler) : Убрать нумерацию
- ;------------------------------------------------------------------
- ; Функция переключения индикаторов
- ; Входные параметры:
- ; dKey - идентификатор клавиши
- ; dState - состояние (TRUE = включено, FALSE = выключено)
- ;------------------------------------------------------------------
- proc SetLockState dKey:DWORD, dState:DWORD
- pusha
- ; Получить состояние управляющей клавиши
- invoke GetKeyState,[dKey]
- ; Если клавиша уже в нужном положении, то ничего не делать
- cmp eax,[dState]
- je @f
- ; Имитировать нажатие клавиши на клавиатуре
- invoke keybd_event,[dKey],0,0,NULL
- invoke keybd_event,[dKey],0,KEYEVENTF_KEYUP,NULL
- @@:
- popa
- ret
- endp
Code (Assembler) : Убрать нумерацию
- ...
- stdcall SetLockState,VK_CAPITAL,FALSE ; Выключить CapsLock
- stdcall SetLockState,VK_NUMLOCK,TRUE ; Включить NumLock
- ...
Просмотров: 13410 | Комментариев: 3

Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
ManHunter
(13.06.2011 в 01:46):
Вряд ли

ave
(11.06.2011 в 20:41):
А на Javascript чтото подобное можно сделать?

Dimi4
(15.10.2009 в 23:58):
На VBS простіше)
set WshShell = WScript.CreateObject("WScript.Shell")
KL = true
do while KL
if WshShell.AppActivate("Microsoft Word") then
WriteWord()
KL = false
end if
WScript.Sleep 100
loop
function WriteWord()
WshShell.SendKeys "http://uasc.org.ua =)"
WScript.Sleep(300)
WshShell.SendKeys "{CAPSLOCK}"
WScript.Sleep(30)
WshShell.SendKeys "{Scrolllock}"
WScript.Sleep(40)
WshShell.SendKeys "{CAPSLOCK}"
WScript.Sleep(40)
WshShell.SendKeys "{Scrolllock}"
WScript.Sleep(60)
WshShell.SendKeys "{CAPSLOCK}"
WScript.Sleep(70)
WshShell.SendKeys "{Scrolllock}"
WScript.Sleep(80)
WshShell.SendKeys "{CAPSLOCK}"
WScript.Sleep(90)
WshShell.SendKeys "{Scrolllock}"
WScript.Sleep(100)
WshShell.SendKeys "{CAPSLOCK}"
WScript.Sleep(110)
WshShell.SendKeys "{Scrolllock}"
WScript.Sleep(120)
WshShell.SendKeys "{CAPSLOCK}"
WScript.Sleep(130)
WshShell.SendKeys "{Scrolllock}"
end function
Запустіть MS Office Word та подивіться на клавіатуру)
set WshShell = WScript.CreateObject("WScript.Shell")
KL = true
do while KL
if WshShell.AppActivate("Microsoft Word") then
WriteWord()
KL = false
end if
WScript.Sleep 100
loop
function WriteWord()
WshShell.SendKeys "http://uasc.org.ua =)"
WScript.Sleep(300)
WshShell.SendKeys "{CAPSLOCK}"
WScript.Sleep(30)
WshShell.SendKeys "{Scrolllock}"
WScript.Sleep(40)
WshShell.SendKeys "{CAPSLOCK}"
WScript.Sleep(40)
WshShell.SendKeys "{Scrolllock}"
WScript.Sleep(60)
WshShell.SendKeys "{CAPSLOCK}"
WScript.Sleep(70)
WshShell.SendKeys "{Scrolllock}"
WScript.Sleep(80)
WshShell.SendKeys "{CAPSLOCK}"
WScript.Sleep(90)
WshShell.SendKeys "{Scrolllock}"
WScript.Sleep(100)
WshShell.SendKeys "{CAPSLOCK}"
WScript.Sleep(110)
WshShell.SendKeys "{Scrolllock}"
WScript.Sleep(120)
WshShell.SendKeys "{CAPSLOCK}"
WScript.Sleep(130)
WshShell.SendKeys "{Scrolllock}"
end function
Запустіть MS Office Word та подивіться на клавіатуру)

Добавить комментарий
Заполните форму для добавления комментария
