2024年10月XP系统中如何屏蔽Ctrl+Esc键序列(3)

发布时间:

  ⑴正是在这段描述中KEYNAME 和VALUENAME指定了注册表的键值对。利用这种方法,你可以为自己的应用程序创建管理模板和策略,但编辑和浏览.adm模板文件的编辑器必须支持Unicode字符。如Notepad或者WordPad等都可以。此外,使用管理模板文件,系统管理员可以用它为整个组织配置需要的策略——由此可以看出,此文件在系统中的地位举足轻重!有关模板管理文件格式的详细信息请参考平台SDK。最后需要强调的是DisableTaskMgr只是禁用Ctrl+Alt+Del的功能。下面我们来讨论如何捕获它的按键序列。要想截获Ctrl+Alt+Del,有三种可选择的方法:

  ⑵、 编写一个GINA代理;此方法我们在以后的文章中介绍。实际上,ac_z_的个人专栏文章:“WINDOWS NT/下如何屏蔽CTRL+ALT+DEL”使用的就是这种方法。

  ⑶、 编写一个键盘驱动程序;本文例子程序使用的方法。

  ⑷、 用自己的程序代替任务管理器程序TaskMgr.exe。

  ⑸屏蔽Ctrl+Alt+Del解决方案的具体实现细节请参考本文的例子代码。

  ⑹下面让我们来解决屏蔽任务切换键序列的问题,这些键序列包括Alt+Tab、Ctrl+Esc、Alt+Esc、VK_LWIN/VK_RWIN以及。在很早以前的Window .年代,处理这个问题的方法是通过WM_SYSKEYDOWN实现。到了Windows x时期,本文前面提到过对这个问题的处理方法,使用SPI_SETSCREENSAVERRUNNING。但是进入Windows NT . (SP +),Windows 以及Windows XP时代,对这个问题的处理已经有所不同,必须写一个低级的键盘驱动钩子。不要怕,因为要实现这个钩子并不是很难。本文下面会介绍如何实现这个键盘钩子。一般来讲,系统级钩子必须是一个DLL。下面是本文提供的一个键盘钩子DLL的源代码片断(TaskKeyHook.dll):

  ⑺////////////////////////////////////////////////////////////////

  ⑻//TaskKeyHook.h

  ⑼#define DLLIMPORT __declspec(dllimport)

  ⑽DLLIMPORT BOOL DisableTaskKeys(BOOL bEnable, BOOL bBeep);

  ⑾DLLIMPORT BOOL AreTaskKeysDisabled();

  ⑿////////////////////////////////////////////////////////////////

  ⒀// TaskKeyHook.cpp

  ⒁#define _WIN_WINNT x // for KBDLLHOOKSTRUCT

  ⒂#include // MFC core and standard ponents

  ⒃#define DLLEXPORT __declspec(dllexport)

  ⒄//////////////////

  ⒅// App (DLL) object

  ⒆class CTaskKeyHookDll : public CWinApp {

  ⒇CTaskKeyHookDll() { }

  ⒈~CTaskKeyHookDll() { }

  ⒉} MyDll;

  ⒊////////////////////////////////////////////////

  ⒋// 下面的代码表示这一部分在此DLL所有实例之间共享

  ⒌// 低级键盘钩子一定是系统级的钩子

  ⒍#pragma data_seg (".mydata")

  ⒎HHOOK g_hHookKbdLL = NULL; // 钩子句柄

  ⒏BOOL g_bBeep = FALSE; // 按下非法键时蜂鸣响铃

  ⒐#pragma data_seg ()

  ⒑#pragma ment(linker, "/SECTION:.mydata,RWS") // 告诉链接器:建立数据共享段

  ⒒//////////////////////////////////

  ⒓// 低级键盘钩子

  ⒔// 截获任务转换键:不传递直接返回

  ⒕LRESULT CALLBACK MyTaskKeyHookLL(int nCode, WPARAM wp, LPARAM lp)

  ⒖KBDLLHOOKSTRUCT *pkh = (KBDLLHOOKSTRUCT *) lp;

  ⒗if (nCode==HC_ACTION) {

  ⒘BOOL bCtrlKeyDown =

  ⒙GetAsyncKeyState(VK_CONTROL)>>((sizeof(SHORT) * ) - );

  ⒚if ((pkh->vkCode==VK_ESCAPE && bCtrlKeyDown) || // Ctrl+Esc

  ⒛// Alt+TAB

  ①(pkh->vkCode==VK_TAB && pkh->flags & LLKHF_ALTDOWN) ||

  ②// Alt+Esc

  ③(pkh->vkCode==VK_ESCAPE && pkh->flags & LLKHF_ALTDOWN)||

  ④(pkh->vkCode==VK_LWIN || pkh->vkCode==VK_RWIN)) { // 开始菜单

  ⑤if (g_bBeep && (wp==WM_SYSKEYDOWN||wp==WM_KEYDOWN))

  ⑥MessageBeep(); // 蜂鸣

  ⑦return ; // 不再往CallNextHookEx传递,直接返回

  ⑧return CallNextHookEx(g_hHookKbdLL, nCode, wp, lp);

  ⑨////////////////////////////////////////////////

  ⑩// 是否屏蔽任务键序列——也就是说键盘钩子是否安装?

  Ⅰ// 注:这里假设没有其它钩子做同样的事情

  Ⅱ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, );

  ㈡} 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 。