Win2000中如何屏蔽掉Ctrl+Alt+Del,开始菜单键,Power键等系统按键?

解决方案 »

  1.   

    procedure SysKeypress(i:integer);//屏蔽系统功能键
    Var
      temp:integer;
    begin
      SystemParametersInfo(Spi_screensaverrunning,i,@temp,0);
    end;
      

  2.   

    当你不需要让用户按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;
      

  3.   

    //隐藏任务栏
    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;
      

  4.   

    caier(彩儿) , cg1120(代码最优化-§雪是冷的,人是暖的§) 
    你们的方法只适用于Win9X 对 Win2000这样的NT系统不好用!不起作用!
      

  5.   

    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.
      

  6.   

    如果要做全局勾子,要做成DLL
      

  7.   

    谁有测试过的完整的实例源码!我的信箱 [email protected]
      

  8.   

    谁能提供全局键盘钩子的原码,谢谢
    [email protected]
      

  9.   

    非常关注,如果哪位高手有可用的源码,请顺便也发一份给我,先谢过了。[email protected]
      

  10.   

    我也要呀
    [email protected]
      

  11.   

    //实现自定义gina接口,设计与winlogon.exe的交互
    // 开发原理:依赖Microsoft默认的gina dll:msgina.dll,在本dll中
    // 导入msgina.dll导出的接口,在本dll的导出接口中,保持大部分接
    // 口与msgina.dll操作的一致性,改变WlxLoggedOnSAS接口的响应,使
    // 系统在登陆成功的状态下,不响应Ctrl+Alt+Del.VC++版,win2k Pass
      

  12.   

    CPP文件
    // Winlogon.exe调用的gina dll中的第一个函数
    // 使gina dll确认是否支持当前版本的Winlogon.exe
    // 传递给winlogon.exe需要那个版本的接口函数
    BOOL WINAPI WlxNegotiate(DWORD dwWinLogonVersion, PDWORD pdwDllVersion)
    {
    return theApp.MyWlxNegotiate(dwWinLogonVersion,pdwDllVersion);
    }// 初始化,winlogon.exe向gina dll传递需要版本的接口函数分配表
    BOOL WINAPI WlxInitialize(LPWSTR    lpWinsta,
      HANDLE    hWlx,
      PVOID     pvReserved,
      PVOID     pWinlogonFunctions,
      PVOID *   pWlxContext
      )
    {
    return theApp.MyWlxInitialize(lpWinsta,hWlx,pvReserved,pWinlogonFunctions,pWlxContext);
    }// 用户登陆成功后,Winlogon.exe调用该函数启动用户外壳程序
    BOOL WINAPI WlxActivateUserShell(PVOID pWlxContext,
     PWSTR pszDesktopName,
     PWSTR pszMprLogonScript,
     PVOID pEnvironment)
    {
    return theApp.MyWlxActivateUserShell(pWlxContext,pszDesktopName,pszMprLogonScript,pEnvironment);
    }// 当系统处于锁定状态时,Winlogon.exe调用该函数
    // 显示一些信息,如锁定者、锁定时间等
    VOID WINAPI WlxDisplayLockedNotice(PVOID pWlxContext)
    {
    theApp.MyWlxDisplayLockedNotice(pWlxContext);
    }// 当没有任何用户登陆时,Winlogon.exe调用该函数显示一些提示信息
    // 可以根据用户的动作模拟SAS事件的发送
    VOID WINAPI WlxDisplaySASNotice(PVOID pWlxContext)
    {
    theApp.MyWlxDisplaySASNotice(pWlxContext);
    }// 当gina dll要显示一些信息时,Winlogon.exe调用该函数
    // 直接返回TRUE表示信息已经显示
    BOOL WINAPI WlxDisplayStatusMessage(PVOID pWlxContext,
    HDESK hDesktop,
    DWORD dwOptions,
    PWSTR pTitle,
    PWSTR pMessage)
    {
    return theApp.MyWlxDisplayStatusMessage(pWlxContext,hDesktop,dwOptions,pTitle,pMessage);
    // return TRUE;
    }// Winlogon.exe调用该函数得到gina dll显示的状态信息
    // 直接返回TRUE表示信息已经接收
    BOOL WINAPI WlxGetStatusMessage(PVOID pWlxContext,
    DWORD *pdwOptions,
    PWSTR pMessage,
    DWORD dwBufferSize)
    {
    return theApp.MyWlxGetStatusMessage(pWlxContext,pdwOptions,pMessage,dwBufferSize);
    // return TRUE;
    }// 在试图锁定工作站之前Winlogon.exe调用该函数,判断是否可以锁定
    // 直接返回FALSE表示不能锁定
    BOOL WINAPI WlxIsLockOk(PVOID pWlxContext)
    {
    return theApp.MyWlxIsLockOk(pWlxContext);
    // return FALSE;
    }// 在试图注销时Winlogon.exe调用该函数,判断能否注销
    // 直接返回FALSE表示不能注销
    BOOL WINAPI WlxIsLogoffOk(PVOID pWlxContext)
    {
    return theApp.MyWlxIsLogoffOk(pWlxContext);
    //  return FALSE;
    }// 当系统处于登陆成功,没有锁定的状态下
    // Winlogon接收到SAS事件,于是调用该函数
    // 现屏蔽所有事件,直接返回
    int WINAPI WlxLoggedOnSAS(PVOID pWlxContext,
      DWORD dwSasType,
      PVOID pReserved)
    {
    //MessageBox(NULL,TEXT("CTRL+ALT+DEL罢工!"),TEXT(":)"),MB_OK);
    return WLX_SAS_ACTION_NONE;
    }// 在没有任何一个用户登陆的情况下,Winlogon.exe接收到SAS事件调用该函数
    int WINAPI WlxLoggedOutSAS(PVOID                pWlxContext,
       DWORD                dwSasType,
       PLUID                pAuthenticationId,
       PSID                 pLogonSid,
       PDWORD               pdwOptions,
       PHANDLE              phToken,
       PWLX_MPR_NOTIFY_INFO pMprNotifyInfo,
       PVOID *              pProfile)
    {
    return theApp.MyWlxLoggedOutSAS(pWlxContext,dwSasType,pAuthenticationId,
    pLogonSid,pdwOptions,phToken,pMprNotifyInfo,pProfile);
    }// Winlogon.exe调用该函数,通知gina dll用户注销操作
    // 允许gina dll做出相应的处理
    VOID WINAPI WlxLogoff(PVOID pWlxContext)
    {
    theApp.MyWlxLogoff(pWlxContext);
    }// Winlogon.exe调用该函数收集有效的认证信息
    // 返回TRUE表示用户被识别
    BOOL WINAPI WlxNetworkProviderLoad(PVOID pWlxContext,
       PWLX_MPR_NOTIFY_INFO pNprNotifyInfo)
    {
    return theApp.MyWlxNetworkProviderLoad(pWlxContext,pNprNotifyInfo);
    // return TRUE;
    }// Winlogon.exe调用该函数,告诉gina dll停止显示状态信息
    // 直接返回TRUE表示信息已经删除
    BOOL WINAPI WlxRemoveStatusMessage(PVOID pWlxContext)
    {
    return theApp.MyWlxRemoveStatusMessage(pWlxContext);
    // return TRUE;
    }// 在屏保程序启动前一瞬Winlogon.exe调用该函数,允许gina dll同屏保程序交互
    // 返回FALSE表示屏保程序不能启动
    BOOL WINAPI WlxScreenSaverNotify(PVOID  pWlxContext, BOOL  *pSecure)
    {
    return theApp.MyWlxScreenSaverNotify(pWlxContext,pSecure);
    }// 在系统关闭之前,Winlogon.exe调用该函数
    // 允许gina dll处理一些系统关闭前的处理
    VOID WINAPI WlxShutdown(PVOID pWlxContext, DWORD ShutdownType)
    {
    theApp.MyWlxShutdown(pWlxContext,ShutdownType);
    }// 当系统要求在用户上下文中启动程序,Winlogon.exe调用该函数
    // 这种情况发生在:浏览器非正常关闭需要重启或需要启动扩展的任务管理器
    // 该接口gina dll可以选择性实现
    BOOL WINAPI WlxStartApplication(PVOID pWlxContext,
    PWSTR pszDesktopName,
    PVOID pEnvironment,
    PWSTR pszCmdLine)
    {
    return theApp.MyWlxStartApplication(pWlxContext,pszDesktopName,pEnvironment,pszCmdLine);
    }// 在锁定状态下,Winlogon.exe接收到SAS事件调用该函数
    int WINAPI WlxWkstaLockedSAS(PVOID pWlxContext, DWORD dwSasType)
    {
    return theApp.MyWlxWkstaLockedSAS(pWlxContext,dwSasType);
    }
      

  13.   

    H文件关键部份
    // CMyGinaApp
    // See MyGina.cpp for the implementation of this class
    //
    typedef (WINAPI * NEGOTIATE)       (DWORD,PDWORD);
    typedef (WINAPI * INITIALIZE)      (LPWSTR,HANDLE,PVOID,PVOID,PVOID *);
    typedef (WINAPI * ACTIVATE_USHELL) (PVOID,PWSTR,PWSTR,PVOID);
    typedef (WINAPI * PARAM_PVOID)     (PVOID);
    typedef (WINAPI * DISP_STATUS)     (PVOID,HDESK,DWORD,PWSTR,PWSTR);
    typedef (WINAPI * GET_STATUS)      (PVOID,DWORD *,PWSTR,DWORD);
    typedef (WINAPI * LOGON_SAS)       (PVOID,DWORD,PVOID);
    typedef (WINAPI * LOGOUT_SAS)      (PVOID,DWORD,PLUID,PSID,PDWORD,PHANDLE,PWLX_MPR_NOTIFY_INFO,PVOID *);
    typedef (WINAPI * NETWORK_LOAD)    (PVOID,PWLX_MPR_NOTIFY_INFO);
    typedef (WINAPI * SCR_SAVER)       (PVOID,BOOL  *);
    typedef (WINAPI * SHUT_DOWN)       (PVOID,DWORD);
    typedef (WINAPI * START_APP)       (PVOID,PWSTR,PVOID,PWSTR);
    typedef (WINAPI * LOCKED_SAS)      (PVOID,DWORD);class CMyGinaApp : public CWinApp
    {
    private:
    HMODULE   hMsDll;public:
    NEGOTIATE         MyWlxNegotiate;
    INITIALIZE        MyWlxInitialize;
    ACTIVATE_USHELL   MyWlxActivateUserShell;
    PARAM_PVOID       MyWlxDisplayLockedNotice;
    PARAM_PVOID       MyWlxDisplaySASNotice;
    DISP_STATUS       MyWlxDisplayStatusMessage;
    GET_STATUS        MyWlxGetStatusMessage;
    PARAM_PVOID       MyWlxIsLockOk;
    PARAM_PVOID       MyWlxIsLogoffOk;
    LOGON_SAS         MyWlxLoggedOnSAS;
    LOGOUT_SAS        MyWlxLoggedOutSAS;
    PARAM_PVOID       MyWlxLogoff;
    NETWORK_LOAD      MyWlxNetworkProviderLoad;
    PARAM_PVOID       MyWlxRemoveStatusMessage;
    SCR_SAVER         MyWlxScreenSaverNotify;
    SHUT_DOWN         MyWlxShutdown;
    START_APP         MyWlxStartApplication;
    LOCKED_SAS        MyWlxWkstaLockedSAS;