IMHO.WS

IMHO.WS (https://www.imho.ws/index.php)
-   Программирование (https://www.imho.ws/forumdisplay.php?f=40)
-   -   Блокировка клавиатуры (https://www.imho.ws/showthread.php?t=81701)

Merlyel 14.03.2005 20:16

Блокировка клавиатуры
 
Можно ли каким-либо образом заблокировать клавиатуру, т.е. нажимаешь на клавиши, а система не реагирует?

RaZEr 14.03.2005 20:23

Выдерни вилку :biggrin:

PS: На дельфи и си - BlockInput()

Borland 14.03.2005 21:18

Цитата:

Сообщение от Jinx
Можно ли каким-либо образом заблокировать клавиатуру, т.е. нажимаешь на клавиши, а система не реагирует?

Конечно можно! Достаточно заменить системный обработчик прерываний на "заглушку", которая нифига не делает... Самое сложное - это написать такую "заглушку" и загрузчик для неё, а потом убедить ОС допустить замену...
А ещё можно просто выключить драйвер клавиатуры - тож нефигово... :biggrin:

Цитата:

Сообщение от RaZEr
PS: На дельфи и си - BlockInput()

Насколько помню, от Ctrl-Alt-Del она не лечит... Скажем, для консольной проги будет блокирован только ввод в конкретной консоли...

CEO 14.03.2005 21:27

На Паскале и под ДОС:
Цитата:

uses Dos;
const
JmpFar : record
OpCode : Byte;
BakInt9 : pointer;
end = (OpCode : $EA; BakInt9 : nil);
procedure MyInt9; far; assembler;
asm
push ax
in al,60h
cmp al,53h {клавиша Del}
jne @Exit
push ds
xor ax,ax
mov ds,ax
mov al,ds:[417h]
and al,0Ch
cmp al,0Ch {Ctrl+Alt ?}
jne @No
in al,61h
mov ah,al
or al,80h
out 61h,al
xchg ah,al
out 61h,al
mov al,20h
out 20h,al
pop ds
pop ax
iret
@No:
pop ds
@Exit:
pop ax
push seg JmpFar
push Offset JmpFar
end;
var
BakExitProc : pointer;
procedure ExitReboot; far; {выполняется пpи завеpшении}
begin
SetIntVec($9,JmpFar.BakInt9);{веpнуть обpаботчик клавиатуpы на pодину}
ExitProc:=BakExitProc;
end;
begin
BakExitProc:=ExitProc;
ExitProc:=@ExitReboot;
GetIntVec($9,JmpFar.BakInt9);{запомнить адpес обpаботчика клавиатуpы}
SetIntVec($9,@MyInt9);{установить свой обpаботчик клавиатуpы}
end.
На Паскале и под Windows:
Цитата:

unit LockSys;
interface
uses
Windows;

type TLockMode = (lmInput, lmSystemKeys, lmBoth);

function FuncAvail(_dllname, _funcname: string; var _p: pointer): boolean;
Function LockSystem(LockMode:TLockMode):Boolean;*
Function UnLockSystem(UnLockMode:TLockMode):Bool*ean;


var
xBlockInput : function(Block: BOOL): BOOL; stdcall;

implementation

function FuncAvail(_dllname, _funcname: string; var _p: pointer): boolean;
var _lib: tHandle;
begin
Result := false;
_p := NIL;
if LoadLibrary(PChar(_dllname)) = 0 then exit;
_lib := GetModuleHandle(PChar(_dllname));
if _lib <> 0 then
begin
_p := GetProcAddress(_lib, PChar(_funcname));
if _p <> NIL then Result := true;
end;
end;

Function LockSystem(LockMode:TLockMode):Boolean;*
begin
Result:=False;

IF LockMode = lmSystemKeys then //Locking system
IF not SystemParametersInfo(SPI_SCREENSAVERRUN*NING, 1, nil, 0) then Exit;

IF LockMode=lmInput then //locking keyb and mouse
if FuncAvail(''USER32.DLL'', ''BlockInput'', @xBlockInput) then xBlockInput(true)
else Exit;

If LockMode = lmBoth then
begin
IF not SystemParametersInfo(SPI_SCREENSAVERRUN*NING, 1, nil, 0) then Exit;
if FuncAvail(''USER32.DLL'', ''BlockInput'', @xBlockInput) then xBlockInput(true)
else Exit;
end;

Result := True;
end;

Function UnLockSystem(UnLockMode:TLockMode):Bool*ean;
begin
Result:=False;

IF UnLockMode = lmSystemKeys then //UnLocking system
IF not SystemParametersInfo(SPI_SCREENSAVERRUN*NING, 0, nil, 0) then Exit;

IF UnLockMode=lmInput then //unlocking keyb and mouse
if FuncAvail(''USER32.DLL'', ''BlockInput'', @xBlockInput) then xBlockInput(false)
else Exit;

IF UnLockMode=lmBoth then
begin
IF not SystemParametersInfo(SPI_SCREENSAVERRUN*NING, 0, nil, 0) then Exit;
if FuncAvail(''USER32.DLL'', ''BlockInput'', @xBlockInput) then xBlockInput(false)
else Exit;
end;

Result := True;
end;

end.

Merlyel 14.03.2005 22:38

Мдя... все время забываю писать, что желательно С.... :) ну ниче.... сам виноват... придется разобраться в Паскале и припахать это к С :)

chesnok 14.03.2005 22:54

CEO
Все эти SPI_SCREENSAVERRUNNING работают только в виндах 9х :D
В NT-based не сработает также и метод Борланда с хуками, ибо заветная комбинация обрабатывается сразу из RIT ;)
Отключение драйвера поможет 100%, но вот разрешит ли тебе это сделать система? :confused:

CEO 14.03.2005 22:58

Цитата:

Jinx:желательно С
На С++:
Цитата:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
// BlockAll (true) - отключить.
// BlockAll (false) - включить.
HINSTANCE Hnd;
DWORD Result;
DWORD __stdcall (*BlockAll)(bool Status); // прототип ф-ии
Hnd = LoadLibrary("User32.dll");
BlockAll = (DWORD __stdcall (*)(bool Status))GetProcAddress(Hnd,"BlockInput");
if(!BlockAll)
{ FreeLibrary(Hnd);
return;
}
if(BlockAll(true)) Sleep(10000);
BlockAll(false);
FreeLibrary(Hnd);
}

Borland 15.03.2005 02:07

Цитата:

chesnok:
метод Борланда с хуками,
Секундочку, какие нафиг хуки? Хуки - это уже не прерывания (аппаратные)... Здесь же всё-таки ближе к подмене драйвера PIC...

CEO 15.03.2005 02:40

Цитата:

Borland:ближе к подмене драйвера
Нехилая задачка однако получится тогда...
Вот здесь: http://www.sources.ru/cpp/system/ctr...el_winxp.shtml
написано как сделать низкоуровневую ловушку для клавиатуры, так, чтобы она работала под Windows XP...


Часовой пояс GMT +4, время: 18:23.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.