Здравствуйте! Возникла задача отключения (полного) клавиатурного ввода (мышь работать должна). Пока я вижу следующие решения: 1. Физическое отключение (только по-моему комп не запустится, при загрузке, не найдя клавиатуры будет требовать нажать F1). 2. Драйвер-фильтр. 3. Команда винды (чего-то похожее keybd...) в батнике на автозагрузке. Вот. Подскажите, если знаете, какие еще способы можно применить для решения задачи. Перечисленные я реализовать могу, просто сейчас думаю по какому пути пойти. Заранее благодарен за ответы.
ksu_ant Если отключить физически - и в BIOS убрать останов по ошибке клавиатуры (во всех AWARD есть точно) то F1 не появится
Глобальный хук на клавиатуру WH_KEYBOARD_LL (там для всего возвращать -1) пример (извиняюсь за Дельфи) program disable_kb; uses Windows; {$APPTYPE CONSOLE} {$J+} const Hook: HHook = 0; WH_KEYBOARD_LL = 13; {$J-} function HookProc(nCode: Integer; MsgID: WParam; Data: LParam): LResult; stdcall; begin Result := -1; end; procedure DisableKB; stdcall; begin if Hook = 0 then Hook:=SetWindowsHookEx(WH_KEYBOARD_LL,@HookProc,HInstance,0); end; procedure EnableKB; stdcall; begin UnhookWindowsHookEx(Hook); Hook:=0; end; begin writeln('disable leyboard on 3 seconds...'); DisableKB(); Sleep(3000); EnableKB(); writeln('kbd enabled, press enter to exit'); readln; end. + Ctrl-Alt-Del + Cltrl-Shift-Esc сабклассингом, подробнее hxxp://irazin.ru/Samples/SASHook.htm
PROFi, slow Спасибо. DelExe В смысле? Мне нужно на компьютере, пользователь которого имеет только ограниченные права (не админ), отключить клавиатурный ввод. Если Вы о том, что из кернел-мода можно обойти отключение на уровне команд винды, то от меня не требуется защита от такого. r90 А как? Корректно выгрузить, чтобы все работало, кроме клавиатуры .
а я не знаю в линухах командой rmmod, а как это делается в винде... я просто мысль кидаю, дабы, если она здравая, то она не была бы пропущена.
ksu_ant А вот это подойдет? 61h для чтения и записи — регистр управления клавиатурой. Если в старший бит этого порта записать значение 1, клавиатура будет заблокирована, если 0 — разблокирована. Другие биты этого порта менять нельзя, так как они управляют другими устройствами (в частности динамиком). Чтобы изменить состояние клавиатуры, надо считать байт из порта, изменить бит 7 и снова записать в порт 61h этот байт. (с) Зубков. 1972475110__zubkov.txt
А это работает в NT? Насколько я знаю, использование подобных команд (rundll32) проходит только в 9х.
slow, твой пример не работет корректно, клавиатура не блочится. <font color="blue]ms-help://MS.MSDNQTR.2003FEB.1033/winui/winui/windowsuserinterfa ce/win dowing/hooks/hookreference/hookfunctions/lowlevelkeyboardproc.htm</font><!--color--> только для 9х
Всем спасибо. Вроде пока подошел вариант физического отключения. Будут неудобства - сделаю программно.
Мне нужно откюченеи клавиатуры. Решил попробовать работу с портами. Юзаю дефлфи, порты "открыл" с помощью проги UserPort. Проблема такая после включения клавиатуры устанавливается медлеенаая скорость повтора сивола при нажатой клавишы. Почему? Как считать скорость повтора и задержку перед повтором? Вот код: procedure TForm1.Button1Click(Sender: TObject); begin asm call WaintKbin mov al,$F5 out 60h,al end; end; procedure TForm1.Button2Click(Sender: TObject); begin asm call WaintKbin mov al,$F4 out 60h,al end; end; procedure WaintKbin; begin asm in al,64h test al,0010b jnz WaintKbin ret end; end;
Всё, написал kernel mode driver. ОНО работает! ) Спс MS-Rem. ps. Ms-Rem, твой пример работы с ring0 вылетает как при выборе драйве как и при другом способе. У мя XP sp2.
вот самый лобовой примитивный вариант вырубания клавы походу рабоет безотказно, хотя мот немного кривовато)) вот код драйвера: Код (Text): ;@echo off ;goto make ;---------------------------------------------------------------------------- .386 .model flat, stdcall option casemap:none include masm32\include\w2k\ntstatus.inc include masm32\include\w2k\ntddk.inc .code DriverEntry proc pDriverObject:PDRIVER_OBJECT, pusRegistryPath:PUNICODE_STRING _wait: in al,64h test al,0010b jnz _wait mov al,0F5h out 60h,al ret DriverEntry endp end DriverEntry ;---------------------------------------------------------------------------- :make set drv=KeyOff masm32\bin\ml /nologo /c /coff %drv%.bat masm32\bin\link /nologo /driver /base:0x10000 /align:32 /out:%drv%.sys /subsystem:native %drv%.obj del %drv%.obj ЗЫ: походу мой первый рабочий драйвер))