如何使用SetWindowHookEx api锁定CTRL + ALT + DEL?

时间:2016-11-12 19:56:18

标签: delphi setwindowshookex

下午好,

我需要使用SetWindowsHookEx锁定 CTRL + ALT + DEL 组合,今天我已经完成了代码,直到现在才开始工作。

此代码在dll中执行(此dll是我的软件),在其他进程中注入。

那么,我如何才能使下面的代码适应工作?

const
WH_KEYBOARD_LL = 13;
LLKHF_ALTDOWN = $20;

type
KBDLLHOOKSTRUCT = record
vkCode: DWORD;
scanCode: DWORD;
flags: DWORD;
time: DWORD;
dwExtraInfo: Longint ;
end;

var
hhkLowLevelKybd : HHOOK;
FoldProc : LongInt;
hSASWnd : HWND;
hThread : Cardinal;

{$R *.dfm}

Function LowLevelKeyboardProc(nCode : Integer; wParam : Longint; var LParam: KBDLLHOOKSTRUCT) : Longint; stdcall;
var
fEatKeystroke : Boolean;
dwThreadId : Cardinal;
begin

If (nCode = HC_ACTION) Then
begin
If (wParam = WM_KEYDOWN) Or
(wParam = WM_SYSKEYDOWN) Or
(wParam = WM_KEYUP) Or
(wParam = WM_SYSKEYUP) Then
begin
fEatKeystroke :=
(((GetKeyState(VK_CONTROL) And $8000) <> 0) And
((LParam.flags And LLKHF_ALTDOWN ) <> 0) And
 (LParam.vkCode = VK_DELETE));

End;

If fEatKeystroke Then
Result := -1
Else
Result := CallNextHookEx(0, nCode, wParam, LongInt(@LParam));
End;

end;

////////// FormCreate event here ///////////

hhkLowLevelKybd := 0;
hhkLowLevelKybd := SetWindowsHookEx(WH_KEYBOARD_LL, @LowLevelKeyboardProc,
HInstance, 0);

end.

4 个答案:

答案 0 :(得分:4)

出于安全原因,Windows不允许您拦截 Ctrl + Alt + Del 。早期版本(Vista之前?)过去通过替换GINA DLL来允许它,但多年来都不允许这样做。

该密钥组合称为secure attention sequence,在登录过程中保证值得信赖。

如果您的目标是仅允许运行您的应用程序,则可以将其配置为在服务器模式下运行,如果您运行的是合适版本的Windows,如TechNet的Set up a device for anyone to use (kiosk mode)所示@LURD友好提供。

答案 1 :(得分:1)

不可能,请参阅以下代码:

program Project1;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  SysUtils,
  Windows,
  Registry,
  vcl.Dialogs;

procedure DisableCtrAltDel(boolState: Boolean);
var
  SystemReg: TRegistry;
  Data: Array [1 .. 48] of Byte;
  i: Byte;
begin
  try

    for i := 1 to 48 do
      Data[i] := $00;

    Data[9] := $09;
    Data[15] := $5B;
    Data[16] := $E0;
    Data[19] := $5C;
    Data[20] := $E0;
    Data[23] := $5D;
    Data[24] := $E0;
    Data[27] := $44;
    Data[31] := $1D;
    Data[35] := $38;
    Data[39] := $1D;
    Data[40] := $E0;
    Data[43] := $38;
    Data[44] := $E0;

    try
      SystemReg := TRegistry.Create;
      with SystemReg do
      begin
        RootKey := HKEY_LOCAL_MACHINE;
        OpenKey('\System\CurrentControlSet\Control\Keyboard Layout', True);

        if boolState then

          WriteBinaryData('Scancode Map', Data, SizeOf(Data))
        else
          DeleteValue('Scancode Map');

        MessageDlg('Restart Windows in order the changes to take effect!',
          mtInformation, [mbOK], 0);
        CloseKey;
      end;
    finally
      SystemReg.Free;
    end;
  except
    MessageDlg
      ('Error occurred while trying to disable ctrl+alt+del and Task Manager',
      mtWarning, [mbOK], 0);
  end;
end;

begin
  try
    DisableCtrAltDel(True);
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;

end.

答案 2 :(得分:0)

按照设计,它无法捕获或阻止 Ctrl + Alt + Del (安全注意序列)。但是有一个商业库(免责声明:我是作者),SasLibEx

  

SasLibEx:可以模拟或阻止安全注意的库   顺序( Ctrl + Alt + Del )但它甚至可以解锁一个   工作站或会话,无需输入或需要用户   凭证(以及更多东西)

有关演示,请参阅此screencast

答案 3 :(得分:0)

不可能。 Ctl-Alt-Del被困在内核中,永远不会进入运行应用程序的用户模式空间。 我必须在自助服务终端系统(使用Win XP和Vista)上执行此操作,我使用键盘过滤器驱动程序(在内核中运行),在按下键时交换扫描代码。