Q&A

  • 마우스나 키보드의 제어
윈도우에서 마우스나 키보드를 사용못하도록 하거나 이를 다시 사용 가능하도록

만들고 싶습니다.

즉, 사용을 못하도록 설정을 하게 되면 아무 키도 눌러지지 않고, 마우스도

움직이지 않도록 하는 것입니다. 윈도우의 시스템 쪽을 제어해야 할것 같은데,

어떠한 방법을 써야 할지 모르겠어서 질문 드립니다.



1  COMMENTS
  • Profile
    김영대 1999.09.06 21:57
    지승용 께서 말씀하시기를...

    > 윈도우에서 마우스나 키보드를 사용못하도록 하거나 이를 다시 사용 가능하도록

    > 만들고 싶습니다.

    > 즉, 사용을 못하도록 설정을 하게 되면 아무 키도 눌러지지 않고, 마우스도

    > 움직이지 않도록 하는 것입니다. 윈도우의 시스템 쪽을 제어해야 할것 같은데,

    > 어떠한 방법을 써야 할지 모르겠어서 질문 드립니다.



    아래는 윈도우즈 전체의 키보드 입력 금지를 하는 예제입니다

    hook과 관련된 자료를 찾아보시면 더 좋은 에제가 있을겁니다



    unit Unit1;



    interface



    uses

    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

    StdCtrls;



    type

    TForm1 = class(TForm)

    Button1: TButton;

    Button2: TButton;

    procedure Button1Click(Sender: TObject);

    procedure Button2Click(Sender: TObject);

    private

    { Private declarations }

    public

    { Public declarations }

    end;



    var

    Form1: TForm1;



    implementation

    {$R *.DFM}



    {IRQNum Tabelle:

    Master:

    IRQ 1: Keyboard



    Slave:

    IRQ 12: Mouse



    OnOff:

    True = it is on

    False = it is off, cant be used}

    procedure IRQ_Control(IRQNum: Byte; OnOff: Boolean);

    var

    NearIRQNum : Byte;

    Port : Word;

    Mask : Byte;

    begin

    NearIRQNum := IRQNum;



    if IRQNum < 8 then

    Port := $21

    else

    begin

    Port := $A1;

    Dec(NearIRQNum, 8);

    end;



    Mask := 128;

    Mask := Mask shr (7-NearIRQNum);



    if OnOff then

    asm

    mov dx, Port // activate irq

    in al, dx

    not Mask

    and al, Mask

    out dx, al

    end

    else

    asm

    mov dx, Port // deactivate it

    in al, dx

    or al, Mask

    out dx, al

    end;

    end;



    function FlushKeyBuffer: boolean;

    var

    KeyStateBuff: TKeyboardState;

    begin

    FillChar(KeyStateBuff, SizeOf(KeyStateBuff), #0);

    Result := SetKeyboardState(KeyStateBuff);

    end;



    procedure TForm1.Button1Click(Sender: TObject);

    begin

    IRQ_Control(1, False); // 키보드 입력 금지

    end;



    procedure TForm1.Button2Click(Sender: TObject);

    begin

    FlushKeyBuffer; // 키보드 버퍼를 flush 한다

    IRQ_Control(1, True); // 키보드 입력 허용

    end;



    end.