公告:系统家 - 最好的系统光盘下载网站! 首页网站地图系统家如何安装系统?设为首页加入收藏
当前位置: 主页 > 系统教程 > WindowsXP教程 > XP系统中如何屏蔽Ctrl+Esc键序列(4)
XP系统中如何屏蔽Ctrl+Esc键序列(4)

XP系统中如何屏蔽Ctrl+Esc键序列(4)

时间:2011-08-22 17:31 作者:系统家点击:
  

  ON_UPDATE_COMMAND_UI(IDC_DISABLE_TASKKEYS, OnUpdateDisableTaskKeys)

  ON_UPDATE_COMMAND_UI(IDC_DISABLE_TASKBAR, OnUpdateDisableTaskbar)

  ON_UPDATE_COMMAND_UI(IDC_DISABLE_TASKMGR, OnUpdateDisableTaskMgr)

  ON_MESSAGE(WM_KICKIDLE,OnKickIdle)

  END_MESSAGE_MAP()

  ///////////////////////////////////////////////

  // 初始化对话框:子类化超链接柄加栽图标

  //

  BOOL CMyDialog::OnInitDialog()

  {

  CDialog::OnInitDialog();

  // 初始化超链接

  m_wndLink1.SubclassDlgItem(IDC_EMAIL,this);

  m_wndLink2.SubclassDlgItem(IDC_VCKBASEURL,this);

  m_wndLink3.SubclassDlgItem(IDC_VCKBASELINK,this);

  // 自己设置对话框图标。MFC不会为对话框应用程序设置它

  m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

  SetIcon(m_hIcon, TRUE); // 打图标

  SetIcon(m_hIcon, FALSE); // 小图标

  return TRUE;

  }

  ////////////////////////////////////////////////////////

  // 命令/UI 更新处理:写这些东西应该很轻松。

  void CMyDialog::OnDisableTaskKeys()

  {

  CTaskKeyMgr::Disable(CTaskKeyMgr::TASKKEYS,

  !CTaskKeyMgr::AreTaskKeysDisabled(), TRUE); // 蜂鸣

  }

  void CMyDialog::OnUpdateDisableTaskKeys(CCmdUI* pCmdUI)

  {

  pCmdUI->SetCheck(CTaskKeyMgr::AreTaskKeysDisabled());

  }

  void CMyDialog::OnDisableTaskbar()

  {

  CTaskKeyMgr::Disable(CTaskKeyMgr::TASKBAR,

  !CTaskKeyMgr::IsTaskBarDisabled());

  }

  void CMyDialog::OnUpdateDisableTaskbar(CCmdUI* pCmdUI)

  {

  pCmdUI->SetCheck(CTaskKeyMgr::IsTaskBarDisabled());

  }

  void CMyDialog::OnDisableTaskMgr()

  {

  CTaskKeyMgr::Disable(CTaskKeyMgr::TASKMGR,

  !CTaskKeyMgr::IsTaskMgrDisabled());

  }

  void CMyDialog::OnUpdateDisableTaskMgr(CCmdUI* pCmdUI)

  {

  pCmdUI->SetCheck(CTaskKeyMgr::IsTaskMgrDisabled());

  }

  ////////////////////////////////////////////////////////

  // 要想让ON_UPDATE_COMMAND_UI正常工作,这是必需的。

  //

  LRESULT CMyDialog::OnKickIdle(WPARAM wp, LPARAM lCount)

  {

  UpdateDialogControls(this, TRUE);

  return 0;

  }

  按上述方法尽管禁用了任务栏,但是还有一个机关没有处理,那就是按下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";

  ///////////////////////////////////////////

  // 禁用相关的任务键(责任编辑:系统家)

顶一下
(0)
0%
踩一下
(0)
0%
评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
教程专题栏目
热门教程推荐
系统下载排行榜
扫一扫关注系统家微信公众号