如何使用 SetWindowsHookEx api 锁定 CTRL+ALT+DEL?
How lock CTRL+ALT+DEL using SetWindowHookEx api?
下午好,
我需要使用 SetWindowsHookEx
锁定 CTRL+ALT+DEL 组合,今天我完成了一个代码,直到现在才开始工作。
此代码在注入其他进程的 dll(此 dll 是我的软件)中执行。
那么,我如何调整下面的代码才能工作?
const
WH_KEYBOARD_LL = 13;
LLKHF_ALTDOWN = ;
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 00) <> 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.
出于安全原因,Windows 不允许您拦截 Ctrl+Alt+Del。早期版本(Vista 之前?)曾经通过替换 GINA DLL 来允许它,但多年来一直不允许。
该组合键被称为 secure attention sequence,作为登录过程的一部分,它保证是值得信赖的。
如果您的目标是只允许您的应用程序 运行,并且您 运行 正在使用合适的 Windows 版本,则可以将其配置为在 kiosk 模式下运行,如 @LURD 友情提供的 TechNet Set up a device for anyone to use (kiosk mode) 所示。
根据设计,不可能捕获或阻止 Ctrl+Alt+Del(安全注意序列)。然而,有一个 commercial 库可用(免责声明:我是作者),SasLibEx.
SasLibEx: a library that can simulate or block the Secure Attention
Sequence (Ctrl+Alt+Del) but it can even unlock a
workstation or session without entering or needing the user’s
credentials (and many more things)
查看此 screencast 以获得演示。
不可能。 Ctl-Alt-Del 被困在内核中,永远不会进入您的应用 运行 的用户模式 space。
我不得不在信息亭系统(使用 Win XP 和 Vista)上执行此操作,并且我使用键盘过滤器驱动程序(在内核中运行)执行此操作,该驱动程序在按下键时交换扫描代码。
不是不可能,看下面代码:
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] := [=10=];
Data[9] := ;
Data[15] := B;
Data[16] := $E0;
Data[19] := C;
Data[20] := $E0;
Data[23] := D;
Data[24] := $E0;
Data[27] := ;
Data[31] := D;
Data[35] := ;
Data[39] := D;
Data[40] := $E0;
Data[43] := ;
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.
下午好,
我需要使用 SetWindowsHookEx
锁定 CTRL+ALT+DEL 组合,今天我完成了一个代码,直到现在才开始工作。
此代码在注入其他进程的 dll(此 dll 是我的软件)中执行。
那么,我如何调整下面的代码才能工作?
const
WH_KEYBOARD_LL = 13;
LLKHF_ALTDOWN = ;
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 00) <> 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.
Windows 不允许您拦截 Ctrl+Alt+Del。早期版本(Vista 之前?)曾经通过替换 GINA DLL 来允许它,但多年来一直不允许。
该组合键被称为 secure attention sequence,作为登录过程的一部分,它保证是值得信赖的。
如果您的目标是只允许您的应用程序 运行,并且您 运行 正在使用合适的 Windows 版本,则可以将其配置为在 kiosk 模式下运行,如 @LURD 友情提供的 TechNet Set up a device for anyone to use (kiosk mode) 所示。
根据设计,不可能捕获或阻止 Ctrl+Alt+Del(安全注意序列)。然而,有一个 commercial 库可用(免责声明:我是作者),SasLibEx.
SasLibEx: a library that can simulate or block the Secure Attention Sequence (Ctrl+Alt+Del) but it can even unlock a workstation or session without entering or needing the user’s credentials (and many more things)
查看此 screencast 以获得演示。
不可能。 Ctl-Alt-Del 被困在内核中,永远不会进入您的应用 运行 的用户模式 space。 我不得不在信息亭系统(使用 Win XP 和 Vista)上执行此操作,并且我使用键盘过滤器驱动程序(在内核中运行)执行此操作,该驱动程序在按下键时交换扫描代码。
不是不可能,看下面代码:
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] := [=10=];
Data[9] := ;
Data[15] := B;
Data[16] := $E0;
Data[19] := C;
Data[20] := $E0;
Data[23] := D;
Data[24] := $E0;
Data[27] := ;
Data[31] := D;
Data[35] := ;
Data[39] := D;
Data[40] := $E0;
Data[43] := ;
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.