2000下屏蔽Ctrl+Alt+Del,高分相送,解决立即给分 如何通过程序屏蔽掉Ctrl+Alt+Del组合键,要求一定要在Win2000下实现,解决立即给分。不够再加!! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 http://www.vchelp.net/vchelp/zart/cad_key.asp?type_id=25&class_id=1&cata_id=2&article_id=84 Win2000中如何屏蔽掉Ctrl+Alt+Del,开始菜单键,Power键等系统按键? 回复人: caier(彩儿) ( ) 信誉:100 2002-12-26 16:00:00 得分:0 procedure SysKeypress(i:integer);//屏蔽系统功能键Var temp:integer;begin SystemParametersInfo(Spi_screensaverrunning,i,@temp,0);end; Top 回复人: caier(彩儿) ( ) 信誉:100 2002-12-26 16:01:00 得分:0 i=1时屏蔽0反之 Top 回复人: cg1120(代码最优化-§雪是冷的,人是暖的§) ( ) 信誉:122 2002-12-26 16:01:00 得分:0 当你不需要让用户按Alt+Enter、Ctrl+Alt+Del、Ctrl+Esc等功能键的时候加入以下代码:Vartemp:integer;beginSystemParametersInfo(Spi_screensaverrunning,1,@temp,0);end; 当你要恢复功能键时用以下代码:VarTemp:integer;beginSystemParametersInfo(spi_screensaverrunning,0,@temp,0);end; Top 回复人: caier(彩儿) ( ) 信誉:100 2002-12-26 16:03:00 得分:0 //隐藏任务栏procedure hideTaskbar;var wndHandle : THandle; wndClass : array[0..50] of Char;begin StrPCopy(@wndClass[0], 'Shell_TrayWnd'); wndHandle := FindWindow(@wndClass[0], nil); ShowWindow(wndHandle, SW_HIDE);end; Top 回复人: sailorhdx(启航船长) ( ) 信誉:100 2002-12-26 16:08:00 得分:0 caier(彩儿) , cg1120(代码最优化-§雪是冷的,人是暖的§) 你们的方法只适用于Win9X 对 Win2000这样的NT系统不好用!不起作用! Top 回复人: cg1120(代码最优化-§雪是冷的,人是暖的§) ( ) 信誉:122 2002-12-26 16:14:00 得分:0 WIN2000?!只能用键盘勾子了,给你一个例子:unit Main;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls;type TMainForm = class(TForm) EnableBtn: TButton; DisableBtn: TButton; AboutBtn: TButton; ExitBtn: TButton; Bell1: TBevel; Image: TImage; procedure AboutBtnClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure EnableBtnClick(Sender: TObject); procedure DisableBtnClick(Sender: TObject); procedure ExitBtnClick(Sender: TObject); procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); procedure FormDestroy(Sender: TObject); private { Private declarations } public { Public declarations } end;var MainForm: TMainForm;implementationuses Hook;{$R *.dfm}type // Declaration from VC++ WINUSER.H // PKBDLLHOOKSTRUCT = ^KBDLLHOOKSTRUCT; KBDLLHOOKSTRUCT = record vkCode: DWORD; scanCode: DWORD; flags: DWORD; time: DWORD; dwExtraInfo: DWORD; end;const LLKHF_ALTDOWN = KF_ALTDOWN shr 8; WH_KEYBOARD_LL = 13;var hhkNTKeyboard: HHOOK; // 钩子句柄// 低级键盘钩子回调函数//function LowLevelKeyboardFunc(nCode: Integer; w_Param: WPARAM; l_Param: LPARAM): LRESULT; stdcall;var blEatKeystroke: Boolean; p: PKBDLLHOOKSTRUCT;begin blEatKeystroke := False; if nCode = HC_ACTION then begin case w_Param of WM_KEYDOWN, WM_SYSKEYDOWN, WM_KEYUP, WM_SYSKEYUP: begin p := PKBDLLHOOKSTRUCT(l_Param); // 进行按键过滤 blEatKeystroke := (((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)) or ((p^.vkCode = VK_DELETE) and ((p^.flags and LLKHF_ALTDOWN) <> 0) and ((GetKeyState(VK_CONTROL) and $8000) <> 0))); end; end; // End of Case end; if blEatKeystroke then begin Result := 1; // 捕获这些组合键,按键消息由自己处理,必须返回 1 Hook.ShowHookInfo; // 显示一个窗口,你可以改为自己的处理代码 end else // 其他的按键,交由别的线程处理(过滤) Result := CallNextHookEx(0, nCode, w_Param, l_Param);end;procedure TMainForm.AboutBtnClick(Sender: TObject);begin Application.MessageBox( PChar('Windows NT 键盘钩子演示程序'#13#10#13#10'作者:Phoenix2000,2001年7月。'), '关于本程序', 0);end;procedure TMainForm.FormCreate(Sender: TObject);begin hhkNTKeyboard := 0; // 钩子句柄初值end;procedure TMainForm.EnableBtnClick(Sender: TObject);begin // 挂上键盘钩子 // hhkNTKeyboard := SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardFunc, HInstance, 0); if hhkNTKeyboard <> 0 then Application.MessageBox('系统键盘钩子已经启动了!', '信息', 64) else Application.MessageBox('无法启动系统键盘钩子!', '错误', 16);end;procedure TMainForm.DisableBtnClick(Sender: TObject);begin // 解除键盘钩子 // if hhkNTKeyboard = 0 then Application.MessageBox('系统键盘钩子已经被禁止了!', '警告', 48) else begin UnhookWindowsHookEx(hhkNTKeyboard); // 卸载钩子 hhkNTKeyboard := 0; Hook.CleanHookForm; // 此行代码与钩子无关,不要误解,是我自己的窗体清除 Application.MessageBox('成功卸载系统键盘钩子!', '信息', 64) end;end;procedure TMainForm.ExitBtnClick(Sender: TObject);begin Close;end;procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);begin CanClose := (hhkNTKeyboard = 0); if not CanClose then Application.MessageBox('请先卸载系统键盘钩子,然后再退出本程序!', '警告', 48);end;procedure TMainForm.FormDestroy(Sender: TObject);begin if hhkNTKeyboard <> 0 then begin UnhookWindowsHookEx(hhkNTKeyboard); hhkNTKeyboard := 0; end; Hook.CleanHookForm;end;end. Top 回复人: stevenpeng(第九种兵器) ( ) 信誉:100 2002-12-26 16:21:00 得分:0 UP来了 Top 回复人: cg1120(代码最优化-§雪是冷的,人是暖的§) ( ) 信誉:122 2002-12-26 16:23:00 得分:0 如果要做全局勾子,要做成DLL Top 回复人: sailorhdx(启航船长) ( ) 信誉:100 2002-12-26 16:36:00 得分:0 hook 文件谁有? Top 回复人: sailorhdx(启航船长) ( ) 信誉:100 2002-12-26 16:48:00 得分:0 谁有测试过的完整的实例源码!我的信箱 [email protected] Top 回复人: sailorhdx(启航船长) ( ) 信誉:100 2002-12-26 22:12:00 得分:0 关注的请帮助UP! Top 回复人: johnmack(爱若琴弦) ( ) 信誉:100 2002-12-26 22:28:00 得分:0 up Top 回复人: Agelboy(再见理想!) ( ) 信誉:100 2002-12-27 00:39:00 得分:0 值得收藏 Top 回复人: sailorhdx(启航船长) ( ) 信誉:100 2002-12-27 08:52:00 得分:0 研究仍在继续中UP Top 回复人: blueWay11(蔚蓝) ( ) 信誉:100 2002-12-27 15:27:00 得分:0 关注 Top 回复人: sailorhdx(启航船长) ( ) 信誉:100 2002-12-27 15:56:00 得分:0 继续· Top 回复人: byteuser() ( ) 信誉:100 2002-12-27 22:06:00 得分:0 谁能提供全局键盘钩子的原码,谢谢[email protected] Top 回复人: bookbull(渔人) ( ) 信誉:100 2002-12-28 15:47:00 得分:0 非常关注,如果哪位高手有可用的源码,请顺便也发一份给我,先谢过了。[email protected] Top 回复人: sailorhdx(启航船长) ( ) 信誉:100 2002-12-30 13:42:00 得分:0 UP Top 回复人: liuliuisme(刘刘) ( ) 信誉:101 2002-12-31 09:50:00 得分:0 up Top 回复人: ly_liuyang(Liu Yang) ( ) 信誉:105 2003-01-01 20:32:00 得分:0 我也要呀[email protected] Top 回复人: silverwonder(刷卡太快请重刷) ( ) 信誉:105 2003-01-02 09:01:00 得分:0 关注中! Top 回复人: joky1981() ( ) 信誉:100 2003-01-05 15:19:00 得分:0 我也要.[email protected] 如何屏蔽系统功能键 有时我们不希望程序被用户用Alt+Tab、Ctrl+Alt+Del、Ctrl+Esc等系统功能键打断(比如自动演示程序),那么该怎么做呢?提示你一点,在运行屏幕保护程序的时候,这些功能键都是不起作用的——也就是说,只要在你的程序运行过程中,“欺骗”一下Windows,使它自以为正处在屏幕保护状态就成了!请看下面这段代码: var temp : integer; begin SystemParametersInfo( SPI_SCREENSAVERRUNNING, 1, @temp, 0); end; 当然,在程序结尾处千万别忘了恢复设置,把Windows“唤醒”。代码如下: var temp : integer; begin SystemParametersInfo( SPI_SCREENSAVERRUNNING, 0, @temp, 0); end; 你到底想要不想要呀?!要是你自己解决了就把贴子删了!要是还没解决而有想解决你...ghbh(我想编但是编不出来) 你在win2k中试了吗?你们这种方法在98下没问题在win2k中没用!这类问题已经讨论过n遍了!有个“高人”做了一个Demo(不用重写系统的VXD),不幸我曾经下载而又忘记在哪下载的了:(:)你们可以自己到网上搜搜......烦~~~~~~~~~~~~ to murphy(豆豆) :对不起我没试过,我是看到过这些文章就给他贴出来了,你是不是有好办法,方便的话能不能给我发一份?谢谢! [email protected] 看看有没有启发和Alt+Esc系统功能键unit Unit1;interfaceuses 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); private { Private declarations } public { Public declarations } end;{按键消息的结构,Delphi中也没有,自己定义吧。这也就是我为什么说用C写这样的程序更好的原因之一。还必须注意的是这个结构在Windows NT 4 sp3以上系统中才能使用}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;var Form1: TForm1; 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 ((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;{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);begin //设置低级键盘钩子 hhkLowLevelKybd := SetWindowsHookExW(WH_KEYBOARD_LL, LowLevelKeyboardProc, Hinstance, 0); if hhkLowLevelKybd <> 0 then MessageBox(0, '低级键盘钩子设置成功!', '提示', MB_OK);end;procedure TForm1.Button2Click(Sender: TObject);begin //卸载低级键盘钩子 if hhkLowLevelKybd <> 0 then begin UnhookWindowsHookEx(hhkLowLevelKybd); MessageBox(0, '低级键盘钩子卸载成功!', '提示', MB_OK); end;end;end. 谢谢大家的帮助,我试过大家的方法,但总是有些问题,最后没办法,只有改2000注册表中的一个键值,不过好像只在Profession版本可以,Server版本不行,'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\AutoAdminLogon'改为2,屏蔽,改为1取消屏蔽。因为那种屏蔽但使屏幕闪烁的方式对我没有用。上面改键值的方式可以不使屏幕闪烁。发分了, 豆豆,我的mail :[email protected]你发一份我看看,谢谢 delphi中弹出窗体 线程问题 ###########问个关于DLL的问题,如果如果我仅是通过函数向DLL传入string类型参数,要加sharemem吗 怎样移位? 请熟悉BusinessSkinForm控件组的进来帮忙看看 怎样把Excel表的数据导入Access中 帮忙推荐一下实现备忘录和日记的控件 xiaohuan()请进来拿分 这是一个起什么作用的关键字“nil” 格式%s无效或不匹配时怎马回事?在线,求求你们; 如何调用其他 Unit 中的Tstrings型数据? 关于Tdatabase数据库关闭失败的问题
回复人: caier(彩儿) ( ) 信誉:100 2002-12-26 16:00:00 得分:0
procedure SysKeypress(i:integer);//屏蔽系统功能键
Var
temp:integer;
begin
SystemParametersInfo(Spi_screensaverrunning,i,@temp,0);
end;
Top
回复人: caier(彩儿) ( ) 信誉:100 2002-12-26 16:01:00 得分:0
i=1时屏蔽
0反之
Top
回复人: cg1120(代码最优化-§雪是冷的,人是暖的§) ( ) 信誉:122 2002-12-26 16:01:00 得分:0
当你不需要让用户按Alt+Enter、Ctrl+Alt+Del、Ctrl+Esc等功能键的时候加入以下代码:
Var
temp:integer;
begin
SystemParametersInfo(Spi_screensaverrunning,1,@temp,0);
end;
当你要恢复功能键时用以下代码:
Var
Temp:integer;
begin
SystemParametersInfo(spi_screensaverrunning,0,@temp,0);
end;
Top
回复人: caier(彩儿) ( ) 信誉:100 2002-12-26 16:03:00 得分:0
//隐藏任务栏
procedure hideTaskbar;
var
wndHandle : THandle;
wndClass : array[0..50] of Char;
begin
StrPCopy(@wndClass[0], 'Shell_TrayWnd');
wndHandle := FindWindow(@wndClass[0], nil);
ShowWindow(wndHandle, SW_HIDE);
end;
Top
回复人: sailorhdx(启航船长) ( ) 信誉:100 2002-12-26 16:08:00 得分:0
caier(彩儿) , cg1120(代码最优化-§雪是冷的,人是暖的§)
你们的方法只适用于Win9X 对 Win2000这样的NT系统不好用!不起作用!
Top
回复人: cg1120(代码最优化-§雪是冷的,人是暖的§) ( ) 信誉:122 2002-12-26 16:14:00 得分:0
WIN2000?!只能用键盘勾子了,给你一个例子:
unit Main;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;type
TMainForm = class(TForm)
EnableBtn: TButton;
DisableBtn: TButton;
AboutBtn: TButton;
ExitBtn: TButton;
Bell1: TBevel;
Image: TImage;
procedure AboutBtnClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure EnableBtnClick(Sender: TObject);
procedure DisableBtnClick(Sender: TObject);
procedure ExitBtnClick(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
MainForm: TMainForm;implementationuses Hook;{$R *.dfm}type
// Declaration from VC++ WINUSER.H
//
PKBDLLHOOKSTRUCT = ^KBDLLHOOKSTRUCT;
KBDLLHOOKSTRUCT = record
vkCode: DWORD;
scanCode: DWORD;
flags: DWORD;
time: DWORD;
dwExtraInfo: DWORD;
end;const
LLKHF_ALTDOWN = KF_ALTDOWN shr 8;
WH_KEYBOARD_LL = 13;var
hhkNTKeyboard: HHOOK; // 钩子句柄// 低级键盘钩子回调函数
//
function LowLevelKeyboardFunc(nCode: Integer; w_Param: WPARAM;
l_Param: LPARAM): LRESULT; stdcall;
var
blEatKeystroke: Boolean;
p: PKBDLLHOOKSTRUCT;
begin
blEatKeystroke := False;
if nCode = HC_ACTION then
begin
case w_Param of
WM_KEYDOWN,
WM_SYSKEYDOWN,
WM_KEYUP,
WM_SYSKEYUP:
begin
p := PKBDLLHOOKSTRUCT(l_Param); // 进行按键过滤
blEatKeystroke := (((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)) or
((p^.vkCode = VK_DELETE) and
((p^.flags and LLKHF_ALTDOWN) <> 0) and
((GetKeyState(VK_CONTROL) and $8000) <> 0)));
end;
end; // End of Case
end;
if blEatKeystroke then
begin
Result := 1; // 捕获这些组合键,按键消息由自己处理,必须返回 1
Hook.ShowHookInfo; // 显示一个窗口,你可以改为自己的处理代码
end
else
// 其他的按键,交由别的线程处理(过滤)
Result := CallNextHookEx(0, nCode, w_Param, l_Param);
end;procedure TMainForm.AboutBtnClick(Sender: TObject);
begin
Application.MessageBox(
PChar('Windows NT 键盘钩子演示程序'#13#10#13#10'作者:Phoenix2000,2001年7月。'),
'关于本程序', 0);
end;procedure TMainForm.FormCreate(Sender: TObject);
begin
hhkNTKeyboard := 0; // 钩子句柄初值
end;procedure TMainForm.EnableBtnClick(Sender: TObject);
begin
// 挂上键盘钩子
//
hhkNTKeyboard := SetWindowsHookEx(WH_KEYBOARD_LL,
LowLevelKeyboardFunc,
HInstance, 0);
if hhkNTKeyboard <> 0 then
Application.MessageBox('系统键盘钩子已经启动了!', '信息', 64)
else
Application.MessageBox('无法启动系统键盘钩子!', '错误', 16);
end;procedure TMainForm.DisableBtnClick(Sender: TObject);
begin
// 解除键盘钩子
//
if hhkNTKeyboard = 0 then
Application.MessageBox('系统键盘钩子已经被禁止了!', '警告', 48)
else
begin
UnhookWindowsHookEx(hhkNTKeyboard); // 卸载钩子
hhkNTKeyboard := 0;
Hook.CleanHookForm; // 此行代码与钩子无关,不要误解,是我自己的窗体清除
Application.MessageBox('成功卸载系统键盘钩子!', '信息', 64)
end;
end;procedure TMainForm.ExitBtnClick(Sender: TObject);
begin
Close;
end;procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose := (hhkNTKeyboard = 0);
if not CanClose then
Application.MessageBox('请先卸载系统键盘钩子,然后再退出本程序!', '警告', 48);
end;procedure TMainForm.FormDestroy(Sender: TObject);
begin
if hhkNTKeyboard <> 0 then
begin
UnhookWindowsHookEx(hhkNTKeyboard);
hhkNTKeyboard := 0;
end;
Hook.CleanHookForm;
end;end.
Top
回复人: stevenpeng(第九种兵器) ( ) 信誉:100 2002-12-26 16:21:00 得分:0
UP
来了
Top
回复人: cg1120(代码最优化-§雪是冷的,人是暖的§) ( ) 信誉:122 2002-12-26 16:23:00 得分:0
如果要做全局勾子,要做成DLL
Top
回复人: sailorhdx(启航船长) ( ) 信誉:100 2002-12-26 16:36:00 得分:0
hook 文件谁有?
Top
回复人: sailorhdx(启航船长) ( ) 信誉:100 2002-12-26 16:48:00 得分:0
谁有测试过的完整的实例源码!我的信箱 [email protected]
Top
回复人: sailorhdx(启航船长) ( ) 信誉:100 2002-12-26 22:12:00 得分:0
关注的请帮助UP!
Top
回复人: johnmack(爱若琴弦) ( ) 信誉:100 2002-12-26 22:28:00 得分:0
up
Top
回复人: Agelboy(再见理想!) ( ) 信誉:100 2002-12-27 00:39:00 得分:0
值得收藏
Top
回复人: sailorhdx(启航船长) ( ) 信誉:100 2002-12-27 08:52:00 得分:0
研究仍在继续中UP
Top
回复人: blueWay11(蔚蓝) ( ) 信誉:100 2002-12-27 15:27:00 得分:0
关注
Top
回复人: sailorhdx(启航船长) ( ) 信誉:100 2002-12-27 15:56:00 得分:0
继续·
Top
回复人: byteuser() ( ) 信誉:100 2002-12-27 22:06:00 得分:0
谁能提供全局键盘钩子的原码,谢谢
[email protected]
Top
回复人: bookbull(渔人) ( ) 信誉:100 2002-12-28 15:47:00 得分:0
非常关注,如果哪位高手有可用的源码,请顺便也发一份给我,先谢过了。[email protected]
Top
回复人: sailorhdx(启航船长) ( ) 信誉:100 2002-12-30 13:42:00 得分:0
UP
Top
回复人: liuliuisme(刘刘) ( ) 信誉:101 2002-12-31 09:50:00 得分:0
up
Top
回复人: ly_liuyang(Liu Yang) ( ) 信誉:105 2003-01-01 20:32:00 得分:0
我也要呀
[email protected]
Top
回复人: silverwonder(刷卡太快请重刷) ( ) 信誉:105 2003-01-02 09:01:00 得分:0
关注中!
Top
回复人: joky1981() ( ) 信誉:100 2003-01-05 15:19:00 得分:0
我也要.
[email protected]
要是你自己解决了就把贴子删了!
要是还没解决而有想解决你...ghbh(我想编但是编不出来) 你在win2k中试了吗?你们这种方法在98下没问题
在win2k中没用!这类问题已经讨论过n遍了!有个“高人”做了一个Demo(不用重写系统的VXD),不幸我曾经下载而又忘记在哪下载的了:(
:)你们可以自己到网上搜搜......烦~~~~~~~~~~~~
对不起我没试过,我是看到过这些文章就给他贴出来了,你是不是有好办法,方便的话能不能给我发一份?谢谢! [email protected]
unit Unit1;
interface
uses
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);
private
{ Private declarations }
public
{ Public declarations }
end;
{按键消息的结构,Delphi中也没有,自己定义吧。这也就是我为什么说用C写
这样的程序更好的原因之一。还必须注意的是这个结构在Windows NT 4 sp3以上系统中才能使用}
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;
var
Form1: TForm1;
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
((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;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
//设置低级键盘钩子
hhkLowLevelKybd := SetWindowsHookExW(WH_KEYBOARD_LL,
LowLevelKeyboardProc, Hinstance, 0);
if hhkLowLevelKybd <> 0 then
MessageBox(0, '低级键盘钩子设置成功!', '提示', MB_OK);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
//卸载低级键盘钩子
if hhkLowLevelKybd <> 0 then
begin
UnhookWindowsHookEx(hhkLowLevelKybd);
MessageBox(0, '低级键盘钩子卸载成功!', '提示', MB_OK);
end;
end;
end.
最后没办法,只有改2000注册表中的一个键值,不过
好像只在Profession版本可以,Server版本不行,
'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\AutoAdminLogon'
改为2,屏蔽,改为1取消屏蔽。
因为那种屏蔽但使屏幕闪烁的方式对我没有用。
上面改键值的方式可以不使屏幕闪烁。
发分了,
你发一份我看看,谢谢