如何通过程序屏蔽掉Ctrl+Alt+Del组合键,要求一定要在Win2000下实现,解决立即给分。不够再加!!

解决方案 »

  1.   

    http://www.vchelp.net/vchelp/zart/cad_key.asp?type_id=25&class_id=1&cata_id=2&article_id=84
      

  2.   

    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等功能键的时候加入以下代码:
    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] 
     
      

  3.   

    如何屏蔽系统功能键  有时我们不希望程序被用户用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;  
      

  4.   

    你到底想要不想要呀?!
    要是你自己解决了就把贴子删了!
    要是还没解决而有想解决你...ghbh(我想编但是编不出来) 你在win2k中试了吗?你们这种方法在98下没问题
    在win2k中没用!这类问题已经讨论过n遍了!有个“高人”做了一个Demo(不用重写系统的VXD),不幸我曾经下载而又忘记在哪下载的了:(
    :)你们可以自己到网上搜搜......烦~~~~~~~~~~~~
      

  5.   

    to  murphy(豆豆) :
    对不起我没试过,我是看到过这些文章就给他贴出来了,你是不是有好办法,方便的话能不能给我发一份?谢谢! [email protected]
      

  6.   

    看看有没有启发和Alt+Esc系统功能键
    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.
      

  7.   

    谢谢大家的帮助,我试过大家的方法,但总是有些问题,
    最后没办法,只有改2000注册表中的一个键值,不过
    好像只在Profession版本可以,Server版本不行,
    'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\AutoAdminLogon'
    改为2,屏蔽,改为1取消屏蔽。
    因为那种屏蔽但使屏幕闪烁的方式对我没有用。
    上面改键值的方式可以不使屏幕闪烁。
    发分了,
      

  8.   

    豆豆,我的mail :[email protected]
    你发一份我看看,谢谢