[10-20 18:28:19] 来源:http://www.67xuexi.com 电脑常识 阅读:85848次
}
////////////////////////////////////////////////
// 是否屏蔽任务键序列——也就是说键盘钩子是否安装?
// 注:这里假设没有其它钩子做同样的事情
//
DLLEXPORT BOOL AreTaskKeysDisabled()
{
return g_hHookKbdLL != NULL;
}
////////////////////////////////////////////////
// 屏蔽任务键:安装低级键盘构
// 返回当前是否屏蔽标志(TRUE/FALSE)
//
DLLEXPORT BOOL DisableTaskKeys(BOOL bDisable, BOOL bBeep)
{
if (bDisable) {
if (!g_hHookKbdLL) {
g_hHookKbdLL = SetWindowsHookEx(WH_KEYBOARD_LL,
MyTaskKeyHookLL, MyDll.m_hInstance, 0);
}
} else if (g_hHookKbdLL != NULL) {
UnhookWindowsHookEx(g_hHookKbdLL);
g_hHookKbdLL = NULL;
}
g_bBeep = bBeep;
return AreTaskKeysDisabled();
}
TaskKeyHook 输出两个函数:DisableTaskKeys 和 AreTaskKeysDisabled。前者安装WH_KEYBOARD_LL 钩子;后者判断这个钩子是否安装。此键盘钩子的处理思路是截获Alt+Tab,Ctrl+Esc,Alt+Esc以及Windows 键VK_LWIN/VK_RWIN,关于这两个键,稍候会有详细描述。当钩子碰到这些键时,它直接返回到调用者,而不是将处理传递给CallNextHookEx 。
LRESULT CALLBACK MyTaskKeyHookLL(...)
{
if (/* 任务键*)
return 1; // 立即返回
return CallNextHookEx(...);
}
TaskKeyHook的大部分实现都很简单。只有一个地方用到了一点小技巧:既使用#pragma data_seg 命名包含全程数据的数据段,并且用#pragma comment (linker...)告诉链接器让这个数据段为共享段。实现细节请参考源代码。本文附带的例子程序(TrapKeys.exe)汇集了上述几个有关屏蔽键盘按键序列的功能,除此之外,它还有一个功能就是禁用任务栏。因为既然禁用了任务转换键,那么一般来说,也必然要禁用任务栏,否则禁用任务转换键就没有意义了。禁用任务栏的具体方法如下:
HWND hwnd = FindWindow("Shell_traywnd", NULL);//找到任务栏
EnableWindow(hwnd, FALSE); // 禁用任务栏
如图四是例子程序运行画面:
图四 TrapKeys程序运行画面
以下是TrapKeys程序的实现代码:
/////////////////////////////////////////////////
// TrapKeys.cpp
//
#include "stdafx.h"
#include "resource.h"
#include "StatLink.h"
#include "TaskKeyMgr.h"
////////////////////
// 主对话框
//
class CMyDialog : public CDialog {
public:
CMyDialog(CWnd* pParent = NULL) : CDialog(IDD_MYDIALOG, pParent) { }
protected:
HICON m_hIcon;
CStaticLink m_wndLink1;
CStaticLink m_wndLink2;
CStaticLink m_wndLink3;
virtual BOOL OnInitDialog();
// 命令/UI 的更新处理
afx_msg void OnDisableTaskMgr();
afx_msg void OnDisableTaskKeys();
afx_msg void OnDisableTaskbar();
afx_msg void OnUpdateDisableTaskMgr(CCmdUI* pCmdUI);
afx_msg void OnUpdateDisableTaskKeys(CCmdUI* pCmdUI);
afx_msg void OnUpdateDisableTaskbar(CCmdUI* pCmdUI);
afx_msg LRESULT OnKickIdle(WPARAM,LPARAM);
DECLARE_MESSAGE_MAP()
};
///////////////////////////////////////////////////////
// 标准的MFC 对话框应用类代码。
//
class CMyApp : public CWinApp {
public:
virtual BOOL InitInstance() {
// 初始化app:运行对话框
CMyDialog dlg;
m_pMainWnd = &dlg;
dlg.DoModal();
return FALSE;
}
virtual int ExitInstance() {
// 为了按全起见,在退出程序的时候,将所有禁用的项目复原
CTaskKeyMgr::Disable(CTaskKeyMgr::ALL, FALSE);
return 0;
}
} theApp;
BEGIN_MESSAGE_MAP(CMyDialog, CDialog)
ON_COMMAND(IDC_DISABLE_TASKKEYS,OnDisableTaskKeys)
ON_COMMAND(IDC_DISABLE_TASKBAR, OnDisableTaskbar)
ON_COMMAND(IDC_DISABLE_TASKMGR, OnDisableTaskMgr)
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 更新处理:写这些东西应该很轻松。