{ ╭══════════════=╮ ║ WIN2K下的功能键屏蔽 ║ ╭══════┤ [email protected] ├══════╮ ║ ║ http://www.the998.com ║ ║ ║ ╰═══════════════╯ ║ ║ ║ ║ WIN2K下的功能键屏蔽 ║ ║ ║ ║ ║ ║ 说明:屏蔽了除ctrl+alt+del外的所有系统热键,如果不想 ║ ║ 让用户使用任务管理器建议你使用最笨的方法:隐藏任务管理器║ ║ 窗体,呵呵,因为我找不到别的方法了 ! ║ ║ 其实这个程序也是我改别人的,欢迎继续修改传播 ! ║ ║ ║ ║ ║ ║ ╭───────────────────────╮ ║ ║ ║ 凌风 ║ ║ ╰══┤ [email protected] ├-═=╯ ║ QQ:10778552 ║ ║ 2003.04.01 ║ ╰───────────────────────╯ }unit disp;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Controls, Forms, Dialogs, StdCtrls; {按键消息的结构,Delphi中没有。 注意:这个结构在Windows NT 4 sp3以上系统 中才能使用} type tagKBDLLHOOKSTRUCT = packed record vkCode: DWORD;//虚拟键值 scanCode: DWORD;//扫描码值(没有用过) {一些扩展标志,这个值比较麻烦,MSDN上说得也不太明白,但是 根据这个程序,这个标志值的第六位数(二进制)为1时ALT键按下为0相反。} flags: DWORD; time: DWORD;//消息时间戳 dwExtraInfo: DWORD;//和消息相关的扩展信息 end; KBDLLHOOKSTRUCT = tagKBDLLHOOKSTRUCT; PKBDLLHOOKSTRUCT = ^KBDLLHOOKSTRUCT;//这个是低级键盘钩子的索引值,Delphi中没有,必须自己定义 const WH_KEYBOARD_LL = 13; //定义一个常量好和上面哪个结构中的flags比较而得出ALT键是否按下 const LLKHF_ALTDOWN = $20; //----声明各个函数------------- function LowLevelKeyboardProc(nCode: Integer; WParam: WPARAM;LParam: LPARAM):LRESULT; stdcall; procedure hookstar; //设置钩子 procedure hookend; var hhkLowLevelKybd: HHOOK; implementation { 功能:低级键盘钩子的回调函数,在里面过滤消息 参数:nCode 是Hook的标志 WParam 表示消息的类型 LParam 是一个指向我们在上面定义的哪个结构KBDLLHOOKSTRUCT的指针 返回值:如果不是0的话windows就把这个消息丢掉,程序就不会再收到这个消息了。 } 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 // Alt+Tab ((p.vkCode = VK_ESCAPE) and ((p.flags and LLKHF_ALTDOWN) <> 0))or // (p.vkCode = VK_Lwin) or (p.vkCode = VK_Rwin)or (p.vkCode = VK_apps) or //上面是屏蔽WIN按键 //((p.vkCode = VK_CONTROL) and (P.vkCode = LLKHF_ALTDOWN) and (P.vkCode = VK_Delete)) or ((p.vkCode = VK_ESCAPE) and ((GetKeyState(VK_CONTROL) and $8000) <> 0)) or ((p.vkCode = VK_F4) and ((p.flags and LLKHF_ALTDOWN) <> 0)) or ((p.vkCode = VK_SPACE) and ((p.flags and LLKHF_ALTDOWN) <> 0)) OR (((p.vkCode = VK_CONTROL) and (P.vkCode = LLKHF_ALTDOWN and p.flags) and (P.vkCode = VK_Delete))) //AND (p.flags = true) ; end; end;if fEatKeystroke = True then Result := 1; if nCode <> 0 then Result := CallNextHookEx(0, nCode, wParam, lParam); end; //----------------------回调函数结束-----------------------------------------procedure hookstar; //设置钩子 begin //设置键盘钩子 if hhkLowLevelKybd = 0 then begin hhkLowLevelKybd := SetWindowsHookExW(WH_KEYBOARD_LL, LowLevelKeyboardProc, Hinstance, 0); if hhkLowLevelKybd <> 0 then //MessageBox(0, '键盘钩子设置成功!', '提示', MB_OK) else MessageBox(0, '键盘钩子设置失败!', '提示', MB_OK); end else //MessageBox(Handle, '键盘钩子已设置!', '提示', MB_OK); end; //---------------------设置钩子完成-----------------procedure hookend;//卸载键盘钩子 begin if hhkLowLevelKybd <> 0 then if UnhookWindowsHookEx(hhkLowLevelKybd) <> False then begin //MessageBox(0, '系统热键恢复使用!', '提示', MB_OK); hhkLowLevelKybd := 0; end else //MessageBox(Handle, '键盘钩子卸载失败!', '提示', MB_OK) else //MessageBox(Handle, '没有发现键盘钩子!', '提示', MB_OK); end; //-------------卸载键盘钩子完成-------------------------end.//-------------------修改分辨率的问题-------------------- function DynamicResolution(X, Y: word): BOOL; var lpDevMode: TDeviceMode; begin Result := EnumDisplaySettings(nil, 0, lpDevMode); if Result then begin lpDevMode.dmFields := DM_PELSWIDTH Or DM_PELSHEIGHT; lpDevMode.dmPelsWidth := X; lpDevMode.dmPelsHeight := Y; lpDevMode.dmDisplayFrequency := 75;//刷新率 Result := ChangeDisplaySettings(lpDevMode, CDS_UPDATEREGISTRY) = DISP_CHANGE_SUCCESSFUL; //CDS_UPDATEREGISTRY 必须写,呵呵,要不就有你好看的(任务栏不变 ) end; end;
So Complex!!!可是Win2000以上的系统的确在 这方面彻底为系统安全作了考虑,把以前的一些 api接口去掉了,所以比较复杂! 不过如果想单纯隐藏“任务管理器”,通过修改 注册表来禁用也是比较方便的。
To:cenjoyer(寒伊轩) 请问你的方法是什么?
有人认为使用一个键盘钩子WH_KEYBOARD就可以解决问题,但实际上问题并不是那么简单。 这是因为键盘钩子WH_KEYBOARD不能截取到系统键的输入。在Windows NT 4.0 SP3或 Windows 2000下系统提供了一个底层系统钩子(Low Level Hook)WH_KEYBOARD_LL。底层键盘钩子存在于用户敲击键盘和系统处理之间,而普通键盘钩子则存在于系统产生WM_KEY***消息之后。很清楚,普通键盘钩子只能截获WM_KEY***消息,而不能对系统键进行操作。但是底层键盘钩子有一个致命的弱点,就是如果调用它的进程或线程出现死循环,则系统将不能处理任何键盘操作。为了解决这个问题,微软在注册表中给出了一个底层键盘钩子处理的限制时间,如果超出了这个时间,系统将进入正常处理。这个时间键值存储在注册表的HKEY_CURRENT_USER\Control Panel\Desktop\ LowLevelHooksTimeout下。 首先需要安装钩子: HHOOK SetWindowsHookEx(int iHookCode, HOOKPROC lpfn,HINSTANCE hModule,DWORD dwThreadId); 其中,第一个参数是钩子的类型;第二个参数是钩子函数的地址;第三个参数是包含钩子函数的模块句柄;第四个参数指定监视的线程。如果指定确定的线程,即为线程专用钩子;如果指定为空,即为全局钩子。其中,全局钩子函数必须包含在DLL(动态链接库)中,而线程专用钩子还可以包含在可执行文件中。得到控制权的钩子函数在完成对消息的处理后,如果想要该消息继续传递,那么它必须调用另外一个SDK中的API函数CallNextHookEx来传递它。钩子函数也可以通过直接返回TRUE来丢弃该消息,并阻止该消息的进一步传递。 下面是实现底层键盘钩子的部分源代码: LRESULT CALLBACK LowLevelKeyboardProc(int nCode,WPARAM wParam, LPARAM lParam) { BOOL fEatKeystroke = FALSE; If (nCode == HC_ACTION) { switch (wParam) { case WM_KEYDOWN: case WM_SYSKEYDOWN: case WM_KEYUP: case WM_SYSKEYUP: PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT) lParam; fEatKeystroke =((p->vkCode == VK_TAB) && ((p->flags & LLKHF_ALTDOWN) != 0)) ||((p->vkCode == VK_ESCAPE) && ((p->flags & LLKHF_ALTDOWN) != 0)) ||((p->vkCode == VK_ESCAPE) && ((GetKeyState(VK_CONTROL) & 0x8000) != 0)); break; } } return(fEatKeystroke ? 1 : CallNextHookEx(NULL, nCode, wParam, lParam)); } int WINAPI WinMain(HINSTANCE hinstExe, HIN STANCE, PTSTR pszCmdLine, int) { //安装底层键盘钩子 HHOOK hhkLowLevelKybd = SetWindow sHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, hinstExe, 0); MessageBox(NULL,TEXT(“Alt+Esc, Ctrl+Esc, and Alt+Tab are now disabled.\n”),TEXT(“Click \“Ok\” to terminate this application and re-enable these keys.”),TEXT(“Disable Low-Level Keys”), MB_OK); UnhookWindowsHookEx(hhkLowLevelKybd); return(0); }
屏蔽任务管理器的代码: uses Registry; procedure EnableTaskManager(YesNo : boolean); const sRegPolicies = '\Software\Microsoft\Windows\CurrentVersion\Policies'; begin with TRegistry.Create do try RootKey:=HKEY_CURRENT_USER; if OpenKey(sRegPolicies+'\System\',True) then begin case YesNo of False: begin WriteInteger('DisableTaskMgr',1); end; True: begin WriteInteger('DisableTaskMgr',0); end; end; end; CloseKey; if OpenKey(sRegPolicies+'\Explorer\',True) then begin case YesNo of False: begin WriteInteger('NoChangeStartMenu',1); WriteInteger('NoClose',1); WriteInteger('NoLogOff',1); end; True: begin WriteInteger('NoChangeStartMenu',0); WriteInteger('NoClose',0); WriteInteger('NoLogOff',0); end; end; end; CloseKey; finally Free; end; end;
╭══════════════=╮
║ WIN2K下的功能键屏蔽 ║
╭══════┤ [email protected] ├══════╮
║ ║ http://www.the998.com ║ ║
║ ╰═══════════════╯ ║
║ ║
║ WIN2K下的功能键屏蔽 ║
║ ║
║ ║
║ 说明:屏蔽了除ctrl+alt+del外的所有系统热键,如果不想 ║
║ 让用户使用任务管理器建议你使用最笨的方法:隐藏任务管理器║
║ 窗体,呵呵,因为我找不到别的方法了 ! ║
║ 其实这个程序也是我改别人的,欢迎继续修改传播 ! ║
║ ║
║ ║
║ ╭───────────────────────╮ ║
║ ║ 凌风 ║ ║
╰══┤ [email protected] ├-═=╯
║ QQ:10778552 ║
║ 2003.04.01 ║
╰───────────────────────╯
}unit disp;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Controls, Forms,
Dialogs, StdCtrls;
{按键消息的结构,Delphi中没有。
注意:这个结构在Windows NT 4 sp3以上系统
中才能使用}
type
tagKBDLLHOOKSTRUCT = packed record
vkCode: DWORD;//虚拟键值
scanCode: DWORD;//扫描码值(没有用过)
{一些扩展标志,这个值比较麻烦,MSDN上说得也不太明白,但是
根据这个程序,这个标志值的第六位数(二进制)为1时ALT键按下为0相反。}
flags: DWORD;
time: DWORD;//消息时间戳
dwExtraInfo: DWORD;//和消息相关的扩展信息
end;
KBDLLHOOKSTRUCT = tagKBDLLHOOKSTRUCT;
PKBDLLHOOKSTRUCT = ^KBDLLHOOKSTRUCT;//这个是低级键盘钩子的索引值,Delphi中没有,必须自己定义
const WH_KEYBOARD_LL = 13;
//定义一个常量好和上面哪个结构中的flags比较而得出ALT键是否按下
const LLKHF_ALTDOWN = $20;
//----声明各个函数-------------
function LowLevelKeyboardProc(nCode: Integer;
WParam: WPARAM;LParam: LPARAM):LRESULT; stdcall;
procedure hookstar; //设置钩子
procedure hookend;
var
hhkLowLevelKybd: HHOOK;
implementation
{
功能:低级键盘钩子的回调函数,在里面过滤消息
参数:nCode 是Hook的标志
WParam 表示消息的类型
LParam 是一个指向我们在上面定义的哪个结构KBDLLHOOKSTRUCT的指针
返回值:如果不是0的话windows就把这个消息丢掉,程序就不会再收到这个消息了。
}
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 // Alt+Tab
((p.vkCode = VK_ESCAPE) and ((p.flags and LLKHF_ALTDOWN) <> 0))or //
(p.vkCode = VK_Lwin) or (p.vkCode = VK_Rwin)or (p.vkCode = VK_apps) or //上面是屏蔽WIN按键
//((p.vkCode = VK_CONTROL) and (P.vkCode = LLKHF_ALTDOWN) and (P.vkCode = VK_Delete)) or
((p.vkCode = VK_ESCAPE) and ((GetKeyState(VK_CONTROL) and $8000) <> 0)) or
((p.vkCode = VK_F4) and ((p.flags and LLKHF_ALTDOWN) <> 0)) or
((p.vkCode = VK_SPACE) and ((p.flags and LLKHF_ALTDOWN) <> 0)) OR
(((p.vkCode = VK_CONTROL) and (P.vkCode = LLKHF_ALTDOWN and p.flags) and (P.vkCode = VK_Delete))) //AND (p.flags = true) ;
end;
end;if fEatKeystroke = True then
Result := 1;
if nCode <> 0 then
Result := CallNextHookEx(0, nCode, wParam, lParam);
end;
//----------------------回调函数结束-----------------------------------------procedure hookstar; //设置钩子
begin
//设置键盘钩子
if hhkLowLevelKybd = 0 then
begin
hhkLowLevelKybd := SetWindowsHookExW(WH_KEYBOARD_LL,
LowLevelKeyboardProc,
Hinstance,
0);
if hhkLowLevelKybd <> 0 then
//MessageBox(0, '键盘钩子设置成功!', '提示', MB_OK)
else
MessageBox(0, '键盘钩子设置失败!', '提示', MB_OK);
end
else
//MessageBox(Handle, '键盘钩子已设置!', '提示', MB_OK);
end;
//---------------------设置钩子完成-----------------procedure hookend;//卸载键盘钩子
begin
if hhkLowLevelKybd <> 0 then
if UnhookWindowsHookEx(hhkLowLevelKybd) <> False then
begin
//MessageBox(0, '系统热键恢复使用!', '提示', MB_OK);
hhkLowLevelKybd := 0;
end
else
//MessageBox(Handle, '键盘钩子卸载失败!', '提示', MB_OK)
else
//MessageBox(Handle, '没有发现键盘钩子!', '提示', MB_OK);
end;
//-------------卸载键盘钩子完成-------------------------end.//-------------------修改分辨率的问题--------------------
function DynamicResolution(X, Y: word): BOOL;
var
lpDevMode: TDeviceMode;
begin
Result := EnumDisplaySettings(nil, 0, lpDevMode);
if Result then
begin
lpDevMode.dmFields := DM_PELSWIDTH Or DM_PELSHEIGHT;
lpDevMode.dmPelsWidth := X;
lpDevMode.dmPelsHeight := Y;
lpDevMode.dmDisplayFrequency := 75;//刷新率
Result := ChangeDisplaySettings(lpDevMode, CDS_UPDATEREGISTRY) = DISP_CHANGE_SUCCESSFUL;
//CDS_UPDATEREGISTRY 必须写,呵呵,要不就有你好看的(任务栏不变 )
end;
end;
这方面彻底为系统安全作了考虑,把以前的一些
api接口去掉了,所以比较复杂!
不过如果想单纯隐藏“任务管理器”,通过修改
注册表来禁用也是比较方便的。
请问你的方法是什么?
这是因为键盘钩子WH_KEYBOARD不能截取到系统键的输入。在Windows NT 4.0 SP3或 Windows 2000下系统提供了一个底层系统钩子(Low Level Hook)WH_KEYBOARD_LL。底层键盘钩子存在于用户敲击键盘和系统处理之间,而普通键盘钩子则存在于系统产生WM_KEY***消息之后。很清楚,普通键盘钩子只能截获WM_KEY***消息,而不能对系统键进行操作。但是底层键盘钩子有一个致命的弱点,就是如果调用它的进程或线程出现死循环,则系统将不能处理任何键盘操作。为了解决这个问题,微软在注册表中给出了一个底层键盘钩子处理的限制时间,如果超出了这个时间,系统将进入正常处理。这个时间键值存储在注册表的HKEY_CURRENT_USER\Control Panel\Desktop\ LowLevelHooksTimeout下。
首先需要安装钩子:
HHOOK SetWindowsHookEx(int iHookCode,
HOOKPROC lpfn,HINSTANCE hModule,DWORD dwThreadId);
其中,第一个参数是钩子的类型;第二个参数是钩子函数的地址;第三个参数是包含钩子函数的模块句柄;第四个参数指定监视的线程。如果指定确定的线程,即为线程专用钩子;如果指定为空,即为全局钩子。其中,全局钩子函数必须包含在DLL(动态链接库)中,而线程专用钩子还可以包含在可执行文件中。得到控制权的钩子函数在完成对消息的处理后,如果想要该消息继续传递,那么它必须调用另外一个SDK中的API函数CallNextHookEx来传递它。钩子函数也可以通过直接返回TRUE来丢弃该消息,并阻止该消息的进一步传递。
下面是实现底层键盘钩子的部分源代码:
LRESULT CALLBACK LowLevelKeyboardProc(int nCode,WPARAM wParam, LPARAM lParam)
{
BOOL fEatKeystroke = FALSE;
If (nCode == HC_ACTION) {
switch (wParam) {
case WM_KEYDOWN:
case WM_SYSKEYDOWN:
case WM_KEYUP:
case WM_SYSKEYUP:
PKBDLLHOOKSTRUCT p =
(PKBDLLHOOKSTRUCT) lParam;
fEatKeystroke =((p->vkCode ==
VK_TAB) && ((p->flags & LLKHF_ALTDOWN)
!= 0)) ||((p->vkCode == VK_ESCAPE) && ((p->flags & LLKHF_ALTDOWN) != 0)) ||((p->vkCode == VK_ESCAPE) &&
((GetKeyState(VK_CONTROL) & 0x8000) != 0));
break;
}
}
return(fEatKeystroke ? 1 : CallNextHookEx(NULL, nCode, wParam, lParam));
}
int WINAPI WinMain(HINSTANCE hinstExe, HIN
STANCE, PTSTR pszCmdLine, int)
{
//安装底层键盘钩子
HHOOK hhkLowLevelKybd = SetWindow
sHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc,
hinstExe, 0);
MessageBox(NULL,TEXT(“Alt+Esc, Ctrl+Esc, and Alt+Tab are now disabled.\n”),TEXT(“Click \“Ok\” to terminate this application and re-enable these keys.”),TEXT(“Disable Low-Level Keys”), MB_OK);
UnhookWindowsHookEx(hhkLowLevelKybd);
return(0);
}
uses
Registry; procedure EnableTaskManager(YesNo : boolean);
const
sRegPolicies = '\Software\Microsoft\Windows\CurrentVersion\Policies';
begin
with TRegistry.Create do
try
RootKey:=HKEY_CURRENT_USER;
if OpenKey(sRegPolicies+'\System\',True) then
begin
case YesNo of
False:
begin
WriteInteger('DisableTaskMgr',1);
end;
True:
begin
WriteInteger('DisableTaskMgr',0);
end;
end;
end;
CloseKey;
if OpenKey(sRegPolicies+'\Explorer\',True) then
begin
case YesNo of
False:
begin
WriteInteger('NoChangeStartMenu',1);
WriteInteger('NoClose',1);
WriteInteger('NoLogOff',1);
end;
True:
begin
WriteInteger('NoChangeStartMenu',0);
WriteInteger('NoClose',0);
WriteInteger('NoLogOff',0);
end;
end;
end;
CloseKey;
finally
Free;
end;
end;
//屏蔽 Alt-Tab
SystemParametersInfo( SPI_SETFASTTASKSWITCH, i, @temp, 0);
//屏蔽Ctrl+Alt+Del
SystemParametersInfo(Spi_screensaverrunning,i,@temp,0);
你发了个短信息给我,上面不是有了吗?(不过有些内容多余)
以下是我从某个Delphi网站抄来的,这个网站是外国的,不过有很多实用技巧,据说是与Borland
公司合作的,可惜我忘了它的网址,有知道的同志务必告诉一声。
正文:(实际上就是更改注册表,代码可以不用这么多呀)
procedure DisableTaskMgr(bTF: Boolean);
var
reg: TRegistry;
begin
reg := TRegistry.Create;
reg.RootKey := HKEY_CURRENT_USER; reg.OpenKey('Software', True);
reg.OpenKey('Microsoft', True);
reg.OpenKey('Windows', True);
reg.OpenKey('CurrentVersion', True);
reg.OpenKey('Policies', True);
reg.OpenKey('System', True); if bTF = True then
begin
reg.WriteString('DisableTaskMgr', '1'); //重点
end
else if bTF = False then
begin
reg.DeleteValue('DisableTaskMgr');
end;
reg.CloseKey;
end; // Example Call:
procedure TForm1.Button1Click(Sender: TObject);
begin
DisableTaskMgr(True);
end;
http://www.iligia.com/public/download/tkhotkey/ligia_tkhotkey_source.rar
记得给分