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

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

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

  // 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();

  }

  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)

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