WEB开发网
开发学院软件开发VC Windows XP系统中如何屏蔽Ctrl+Alt+Del、Alt+Tab以... 阅读

Windows XP系统中如何屏蔽Ctrl+Alt+Del、Alt+Tab以及Ctrl+Esc键序列

 2010-07-15 20:45:08 来源:WEB开发网   
核心提示:按上述方法尽管禁用了任务栏,但是还有一个机关没有处理,Windows XP系统中如何屏蔽Ctrl+Alt+Del、Alt+Tab以及Ctrl+Esc键序列(6),那就是按下Windows键仍然可以弹出“开始”菜单,显然在处理VK_LWIN之前,禁用任务转换按键和任务栏,但是不禁用Ctrl+Alt

按上述方法尽管禁用了任务栏,但是还有一个机关没有处理,那就是按下Windows键仍然可以弹出“开始”菜单。显然在处理VK_LWIN之前,任务栏不会检查是否被启用。一般来讲,如果某个窗口被屏蔽掉,那么它就不再会处理用户在这个窗口的输入——这就是所谓的禁用(Disable)的含义。通常调用EnableWindow(FALSE)后自然就达到了这个目的。但是处理VK_LWIN/VK_RWIN按键的代码决不会去检查任务栏启用/禁用状态。对此,本文的处理办法仍然是利用键盘钩子。修改一下TaskKeyHook实现,增加对Windows键的捕获。这样按下“开始”菜单键之后什么也不会发生。希望没有漏掉其它的按键。如果哪位读者发现漏掉了什么键,请和我联系,以便把它加到键盘钩子中去。为了简单起见,我在类CTaskKeyMgr中封装了所有禁用的函数。下面是这个类的定义击实现文件:

TaskKeyMgr
////////////////////////////////////////
// TaskKeyMgr.h
//
#pragma once
#include "TaskKeyHook.h"
/////////////////////////////////////////////////////////////////////
// 使用这个类禁用任务键,任务管理器或任务栏。
// 用相应的标志调用Disable,如:CTaskMgrKeys::Disable(CTaskMgrKeys::ALL);
//
class CTaskKeyMgr {
public:
  enum {
   TASKMGR = 0x01, // 禁用任务管理器(Ctrl+Alt+Del)
   TASKKEYS = 0x02, //禁用任务转换键(Alt-TAB, etc)
   TASKBAR = 0x04, //禁用任务栏
   ALL=0xFFFF    //禁用所有东西L
  };
  static void Disable(DWORD dwItem,BOOL bDisable,BOOL bBeep=FALSE);
  static BOOL IsTaskMgrDisabled();
  static BOOL IsTaskBarDisabled();
  static BOOL AreTaskKeysDisabled() {
   return ::AreTaskKeysDisabled(); // 调用 DLL
  }
};
CPP实现
////////////////////////////////////////////////////////////////
// TaskKeyMgr.cpp
//
#include "StdAfx.h"
#include "TaskKeyMgr.h"
#define HKCU HKEY_CURRENT_USEr
// 用于禁用任务管理器策略的注册表键值对
LPCTSTR KEY_DisableTaskMgr =
  "Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System";
LPCTSTR VAL_DisableTaskMgr = "DisableTaskMgr";
///////////////////////////////////////////
// 禁用相关的任务键
//
// dwFlags  = 表示禁用什么
// bDisable  = 禁用为 (TRUE) ,否则为启用 (FALSE)
// bBeep  = 按下非法键是否蜂鸣(指针对任务键)
//
void CTaskKeyMgr::Disable(DWORD dwFlags, BOOL bDisable, BOOL bBeep)
{
  // 任务管理器 (Ctrl+Alt+Del)
  if (dwFlags & TASKMGR) {
   HKEY hk;
   if (RegOpenKey(HKCU, KEY_DisableTaskMgr,&hk)!=ERROR_SUCCESS)
     RegCreateKey(HKCU, KEY_DisableTaskMgr, &hk);
   if (bDisable) { // 禁用任务管理器(disable TM): set policy = 1
     DWORD val=1;
     RegSetValueEx(hk, VAL_DisableTaskMgr, NULL,
      REG_DWORD, (BYTE*)&val, sizeof(val));
   } else { // 启用任务管理器(enable TM)
     RegDeleteValue(hk,VAL_DisableTaskMgr);
   }
  }
  // 任务键 (Alt-TAB etc)
  if (dwFlags & TASKKEYS)
   ::DisableTaskKeys(bDisable,bBeep); // 安装键盘钩
  // 任务栏
  if (dwFlags & TASKBAR) {
   HWND hwnd = FindWindow("Shell_traywnd", NULL);
   EnableWindow(hwnd, !bDisable);
  }
}
BOOL CTaskKeyMgr::IsTaskBarDisabled()
{
  HWND hwnd = FindWindow("Shell_traywnd", NULL);
  return IsWindow(hwnd) ? !IsWindowEnabled(hwnd) : TRUE;
}
BOOL CTaskKeyMgr::IsTaskMgrDisabled()
{
  HKEY hk;
  if (RegOpenKey(HKCU, KEY_DisableTaskMgr, &hk)!=ERROR_SUCCESS)
   return FALSE; // 没有此键,不禁用
  DWORD val=0;
  DWORD len=4;
  return RegQueryValueEx(hk, VAL_DisableTaskMgr,
   NULL, NULL, (BYTE*)&val, &len)==ERROR_SUCCESS && val==1;
}

这个类中的函数都是静态的,实际上CTaskKeyMgr完全就是一个名字空间。你可以在自己的程序中随心所欲地使用它。例如,禁用任务转换按键和任务栏,但是不禁用Ctrl+Alt+Del:

CTaskKeyMgr::Disable(CTaskKeyMgr::TASKKEYS |
           CTaskKeyMgr::TASKBAR, TRUE);

此外,还有几个函数是用来检查当前禁用了哪些东西,甚至可以在用户按下禁用键时发出蜂鸣声……自己去享受Paul的源代码吧!

本文配套源码

上一页  1 2 3 4 5 6 

Tags:Windows XP

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接