Q&A

  • 윈도우2000의 시스템키를 막기(Ctrl+Alt+Del, Alt+Tab, Ctrl+ESC)
// Ctrl+Alt+Del 키를 사용못하게...

SystemParametersInfo(SPI_SCREENSAVERRUNNING,1,@nOldVal,0);

// Alt+Tab 및 Ctrl+ESC 막기

SystemParametersInfo(SPI_SETFASTTASKSWITCH,1,@nOldVal,0);



95/98에서는 위와같이 사용하는데...

2000은 먹질 않더라구요...

아시는분 도움 좀 주세요



1  COMMENTS
  • Profile
    구창민 2001.10.31 10:55
    처음 wrote:

    > // Ctrl+Alt+Del 키를 사용못하게...

    > SystemParametersInfo(SPI_SCREENSAVERRUNNING,1,@nOldVal,0);

    > // Alt+Tab 및 Ctrl+ESC 막기

    > SystemParametersInfo(SPI_SETFASTTASKSWITCH,1,@nOldVal,0);

    >

    > 95/98에서는 위와같이 사용하는데...

    > 2000은 먹질 않더라구요...

    > 아시는분 도움 좀 주세요

    >







    안녕하세요~ 구창민입니다.



    SystemParametersInfo 함수는 윈도그9.x 전용함수입니다.



    NT 계열에서는 지원하시지 않지요.



    아래 소스를 참고하세요.



    윈도그 2000 에서 Alt+Tab, Alt+ESC, Ctrl+ESC 키들을 막아줍니다.



    손쉽게 테스트 해보려면 빈폼을 올리고 Button을 두개 올린다음



    ButtonClick 이벤트를 두개다 만드시구요. 두 Button을 더블클릭 한번씩 하시면 됩니다. ^_^;



    그런다음 아래 소스를 통째로 Unit1 파일에 엎어쓰세요.



    예전에 테스트 해본 코드니 바로 컴파일 될겁니다.



    그럼~ 항상 즐거운 프로그래밍 하시길~~~





    unit Unit1;



    interface



    uses

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

    StdCtrls, ExtCtrls;



    type

    PKBDLLHOOKSTRUCT = ^TKBDLLHOOKSTURCUT;

    TKBDLLHOOKSTURCUT = record

    vkCode,

    scanCode,

    flag,

    time,

    dwExtraInfo: DWORD;

    end;





    TForm1 = class(TForm)

    Button1: TButton;

    Button2: TButton;

    procedure Button1Click(Sender: TObject);

    procedure Button2Click(Sender: TObject);

    private

    { Private declarations }

    hRainKeyHook: cardinal;

    public

    { Public declarations }

    end;



    var

    Form1: TForm1;

    hhookCurrent: HHOOK;



    implementation



    {$R *.DFM}



    function KeyBoardProc( icode: integer; wParam: integer; lParam: integer): integer; stdcall;

    var

    p: PKBDLLHOOKSTRUCT;

    fEatKeystroke: Boolean;

    begin

    fEatKeystroke := False;



    if ( icode = HC_ACTION ) then

    begin

    case ( wParam ) of

    WM_KEYDOWN, WM_SYSKEYDOWN, WM_KEYUP, WM_SYSKEYUP:

    begin

    p := PKBDLLHOOKSTRUCT( lParam );

    fEatKeystroke := ( p^.vkCode = VK_TAB ) and ( ( p^.flag and $00000020 ) <> 0 ) or

    ( p^.vkCode = VK_ESCAPE ) and ( ( p^.flag and $00000020 ) <> 0 ) or

    ( p^.vkCode = VK_ESCAPE ) and ( ( GetKeyState( VK_CONTROL ) and $8000 ) <> 0 );

    end;

    end;

    end;



    if fEatKeystroke then result := 1

    else

    result := CallNextHookEx(0, iCode, wParam, lParam);

    end;





    procedure TForm1.Button1Click(Sender: TObject);

    begin

    hhookCurrent := SetWindowsHookEx( 13{WH_KEYBOARD_LL}, @KeyBoardProc, HInstance, 0 );

    caption := inttostr( hhookCurrent );

    end;



    procedure TForm1.Button2Click(Sender: TObject);

    begin

    if hhookCurrent <> 0 then

    begin

    UnhookWindowsHookEx( hhookCurrent );

    hhookCurrent := 0;

    end;

    end;



    end.