大家好:
当你不需要让用户按Alt+Enter、Ctrl+Alt+Del、Ctrl+Esc等功能键的时候,我应该怎么做啊 ???我能把整个键盘屏蔽掉,但屏蔽不了系统功能的组合键!!?!????
请各位前辈指导啊!!!!!!!!!!!!!!
当你不需要让用户按Alt+Enter、Ctrl+Alt+Del、Ctrl+Esc等功能键的时候,我应该怎么做啊 ???我能把整个键盘屏蔽掉,但屏蔽不了系统功能的组合键!!?!????
请各位前辈指导啊!!!!!!!!!!!!!!
temp:integer;
begin
SystemParametersInfo(Spi_screensaverrunning,1,@temp,0);
end;
Var //恢复
Temp:integer;
begin
SystemParametersInfo(spi_screensaverrunning,0,@temp,0);
end; 不起作用啊 ????????????????????为什么呢?
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
//function LowLevelKeyboardProc(nCode: Integer;
//WParam: WPARAM;LParam: LPARAM):LRESULT; stdcall;
end; tagKBDLLHOOKSTRUCT = packed record//按键消息的结构
vkCode: DWORD;//虚拟键值
scanCode: DWORD;//扫描码值
flags: DWORD;
time: DWORD;//消息时间戳
dwExtraInfo: DWORD;//和消息相关的扩展信息
end;KBDLLHOOKSTRUCT = tagKBDLLHOOKSTRUCT;
PKBDLLHOOKSTRUCT = ^KBDLLHOOKSTRUCT;//这个是低级键盘钩子的索引值,Delphi中没有,必须自己定义
const WH_KEYBOARD_LL = 13;
//定义一个常量好和上面哪个结构中的flags比较而得出ALT键是否按下
const LLKHF_ALTDOWN = $20;
var
Form1: TForm1;
hhkLowLevelKybd: HHOOK;implementation{$R *.dfm}
function LowLevelKeyboardProc(nCode: Integer;
WParam: WPARAM;LParam: LPARAM):LRESULT; stdcall;
var
fEatKeystroke: BOOL;
p: PKBDLLHOOKSTRUCT;
begin
Result := 0;
fEatKeystroke := FALSE;
p := PKBDLLHOOKSTRUCT (lParam);
//nCode值为HC_ACTION时表示WParam和LParam参数包涵了按键消息
if (nCode = HC_ACTION) then
begin
//拦截按键消息并测试是否是Ctrl+Esc、Alt+Tab、和Alt+Esc功能键。
case wParam of
WM_KEYDOWN,
WM_SYSKEYDOWN,
WM_KEYUP,
WM_SYSKEYUP:
fEatKeystroke :=
((p.vkCode = VK_TAB) and ((p.flags and LLKHF_ALTDOWN) <> 0)) or
((p.vkCode = VK_ESCAPE) and ((p.flags and LLKHF_ALTDOWN) <> 0)) or
((p.vkCode = VK_ESCAPE) and ((GetKeyState(VK_CONTROL) and $8000) <> 0));
end;
end;if fEatKeystroke = True then
Result := 1;
if nCode <> 0 then
Result := CallNextHookEx(0, nCode, wParam, lParam);end;
procedure TForm1.Button1Click(Sender: TObject);
begin
//设置低级键盘钩子
if hhkLowLevelKybd = 0 then
begin
hhkLowLevelKybd := SetWindowsHookExW(WH_KEYBOARD_LL,
LowLevelKeyboardProc, Hinstance, 0);
if hhkLowLevelKybd <> 0 then
MessageBox(Handle, '低级键盘钩子设置成功!', '提示', MB_OK)
else
MessageBox(Handle, '低级键盘钩子设置失败!', '提示', MB_OK);
end
else
MessageBox(Handle, '低级键盘钩子已设置!', '提示', MB_OK);
end;procedure TForm1.Button2Click(Sender: TObject);
begin
//卸载低级键盘钩子
if hhkLowLevelKybd <> 0 then
if UnhookWindowsHookEx(hhkLowLevelKybd) <> False then
begin
MessageBox(Handle, '低级键盘钩子卸载成功!', '提示', MB_OK);
hhkLowLevelKybd := 0;
end
else
MessageBox(Handle, '低级键盘钩子卸载失败!', '提示', MB_OK)
else
MessageBox(Handle, '没有发现低级键盘钩子!', '提示', MB_OK);
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
//在Form关闭的时候检测,如果没有卸载钩子就卸载之
if hhkLowLevelKybd <> 0 then
UnhookWindowsHookEx(hhkLowLevelKybd);
end;end.
((p.vkCode = VK_ESCAPE) and ((p.flags and LLKHF_ALTDOWN) <> 0)) or
((p.vkCode = VK_ESCAPE) and ((GetKeyState(VK_CONTROL) and $8000) <> 0));如果想要屏蔽其他的键,你在此处继续添加你要屏蔽的键。
temp:integer;
begin
SystemParametersInfo(Spi_screensaverrunning,1,@temp,0);
end;
Var //恢复
Temp:integer;
begin
SystemParametersInfo(spi_screensaverrunning,0,@temp,0);
end; 不起作用啊 ????????????????????为什么呢?98 下起作用 钩子钩不到cad的组合键盘 cad屏蔽,查询csdn 上cad屏蔽终结版 用进程注入,vc的代码
原理也讲的很清楚,一般的组合键 屏蔽用楼上的