锁键盘一般都用封锁20端口的方法:
锁键盘
procedure TForm1.Button1Click(Sender: TObject);
begin
  Asm    //封锁20端口
    IN AL,21H
    OR AL,02H
    OUT 21H,AL
  end;
end;解锁键盘:
procedure TForm1.Button2Click(Sender: TObject);
begin
  Asm     //解锁20端口
    IN AL,21H
    AND AL,0FDH
    OUT 21H,AL
  end;
end; 但是,但是,这是一个特权指令,你要获得比ring3高的权限才行

解决方案 »

  1.   

    系统键可以用SystemParametersInfo屏蔽,
    一般键用keyboard hook :
    Library KillKB;
    Uses Wintypes, WinProcs
    {$IFNDEF VER80},
    {$ENDIF};
    Var
    oldHook: Hhook;Function KbHook( code: Integer; wparam: Word; lparam: LongInt ): LongInt;
    export;
    Begin
    If code < 0 Then
    KbHook := CallNextHookEx( oldHook, code, wparam, lparam )
    Else
    KbHook := 1;
    End; { KbHook }Function DisableKeyboard: Boolean; export;
    Begin
    oldHook := SetWindowsHookEx( WH_KEYBOARD, KbHook, Hinstance, 0 );
    DisableKeyboard := oldHook <> 0;
    End;Procedure EnableKeyboard; export;
    Begin
    If oldHook <> 0 Then Begin
    UnhookWindowshookEx( oldHook );
    oldHook := 0;
    End; { If }
    End;exports
    DisableKeyboard index 1,
    EnableKeyboard index 2;Begin
    oldHook := 0;
    End.
      

  2.   

    想锁住键盘:var KHK: HHook;
        tmp: integer;
    function HookProc(ICode: integer;WP:WParam;LP:LParam):LResult;
    begin
      Result:=CallNextHookEx(KHK,0,0,0);
    end;使用下列语句开始锁定:
    KHK:=SetWindowsHookex(WH_JOURNALPLAYBACK,@HookProc,HInstance,0);
    使用下列语句结束锁定:
    UnHookWindowsHookEx(KHK);这时候不能屏蔽Windows的系统键Ctrl-Alt-Tab,Ctrl-Esc,Alt-Tab等
    你就可以使用:
    SystemParametersInfo(SPI_SCREENSAVERRUNNING, 1, @tmp, 0);//锁起来
    SystemParametersInfo(SPI_SCREENSAVERRUNNING, 0, @tmp, 0);//打开吧
    或这样:
    procedure TForm1.Button1Click(Sender: TObject);
    Begin
      Asm    //封锁20口
      IN AL,21H
      OR AL,02H
      OUT 21H,AL
      end;
    End;procedure TForm1.Button2Click(Sender: TObject);
    Begin
     Asm         //解开20口
     IN AL,21H
     AND AL,0FDH
     OUT 21H,AL
     end;
    End;