如题

解决方案 »

  1.   

    {
                    ╭══════════════=╮
                    ║    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;
      

  2.   

    So Complex!!!可是Win2000以上的系统的确在
    这方面彻底为系统安全作了考虑,把以前的一些
    api接口去掉了,所以比较复杂!
    不过如果想单纯隐藏“任务管理器”,通过修改
    注册表来禁用也是比较方便的。
      

  3.   

    To:cenjoyer(寒伊轩) 
    请问你的方法是什么?
      

  4.   

    有人认为使用一个键盘钩子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); 
      } 
      

  5.   

    屏蔽任务管理器的代码:
    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;
      

  6.   

    没有解决对Ctrl+Alt+Del、Alt+ Tab功能键呀?有没有Windows Api函数呢?下面这个是不是呢?
       //屏蔽 Alt-Tab
        SystemParametersInfo( SPI_SETFASTTASKSWITCH, i, @temp, 0);
      //屏蔽Ctrl+Alt+Del
        SystemParametersInfo(Spi_screensaverrunning,i,@temp,0);
      

  7.   

    这个函数只对WIN9X操作系统有效。
    你发了个短信息给我,上面不是有了吗?(不过有些内容多余)
    以下是我从某个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; 
      

  8.   

    我有delphi的源码,xp下面不能用
    http://www.iligia.com/public/download/tkhotkey/ligia_tkhotkey_source.rar
    记得给分
      

  9.   

    http://expert.csdn.net/Expert/topic/1727/1727019.xml?temp=.12138