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";
///////////////////////////////////////////
// 禁用相关的任务键(责任编辑:系统家)