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开发网   
核心提示:屏蔽Ctrl+Alt+Del解决方案的具体实现细节请参考本文的例子代码,下面让我们来解决屏蔽任务切换键序列的问题,Windows XP系统中如何屏蔽Ctrl+Alt+Del、Alt+Tab以及Ctrl+Esc键序列(4),这些键序列包括Alt+Tab、Ctrl+Esc、Alt+Esc、VK_LWIN/VK_RWIN以及

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

下面让我们来解决屏蔽任务切换键序列的问题,这些键序列包括Alt+Tab、Ctrl+Esc、Alt+Esc、VK_LWIN/VK_RWIN以及任务栏。在很早以前的Window 3.1年代,处理这个问题的方法是通过WM_SYSKEYDOWN实现。到了Windows 9x时期,本文前面提到过对这个问题的处理方法,使用SPI_SETSCREENSAVERRUNNING。但是进入Windows NT 4.0 (SP3 +),Windows 2000以及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 _WIN32_WINNT 0x0500 // for KBDLLHOOKSTRUCT
#include <afxwin.h>     // MFC core and standard components
#define DLLEXPORT __declspec(dllexport)
//////////////////
// App (DLL) object
//
class CTaskKeyHookDll : public CWinApp {
public:
  CTaskKeyHookDll() { }
  ~CTaskKeyHookDll() { }
} MyDll;
////////////////////////////////////////////////
// 下面的代码表示这一部分在此DLL所有实例之间共享
// 低级键盘钩子一定是系统级的钩子
//
#pragma data_seg (".mydata")
HHOOK g_hHookKbdLL = NULL; // 钩子句柄
BOOL g_bBeep = FALSE;   // 按下非法键时蜂鸣响铃
#pragma data_seg ()
#pragma comment(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) * 8) - 1);
   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(0); // 蜂鸣
     return 1; // 不再往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, 0);
   }
  } else if (g_hHookKbdLL != NULL) {
   UnhookWindowsHookEx(g_hHookKbdLL);
   g_hHookKbdLL = NULL;
  }
  g_bBeep = bBeep;
  return AreTaskKeysDisabled();
}

上一页  1 2 3 4 5 6  下一页

Tags:Windows XP

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