如果你是基于Windows操作系统做系统集成,你可能希望你的最终产品独占系统资源。您希望标准化用户行为。例如,您不希望用户通过按 Ctrl+Alt+Del 来终止进程,或按 Win 键弹出开始菜单,
或按 Alt+Tab 组合键切换到另一个应用程序。作者有一篇相关文章《在Win2K/NT下阻止Ctrl+Alt+Del的响应》,介绍了如何通过GINA编程接口阻止Ctrl+Alt+Del的响应。作为延续,本文将继续介绍屏蔽Win键和Alt+Tab组合键的方法。
由于这些按钮的反应是系统级的,我们不可能简单地通过某个程序来控制它们。因此,我们需要使用 Microsoft-Hook 提供的另一个编程接口。你可能已经对钩子有了很好的了解(网上有很多关于钩子技术和应用的文章)。简单的说,钩子是一种通过替换系统提供的标准接口来拦截特定事件(消息)的技术,最终达到改变或增强系统默认行为的目的。我们现在的任务是在用户按下 Win 键或 Alt+Tab 组合键但系统没有响应之前拦截它们,然后更改系统的默认行为。很明显,我们需要做一个全局钩子(钩子函数在单独的DLL中实现),它是一个Low Level Keyboard hook。
第一步是实现hook DLL。我们首先要定义一个全局数据区(记住这是一个全局钩子),如下(放在cpp文件的顶部):
#pragma data_seg("mydata")
HHOOK glhHook = NULL; // 安装鼠标钩柄
HINSTANCE glhInstance = NULL; // DLL 实例句柄
#pragma data_seg()
然后在.def文件中声明这个数据区如下:
部分
我的数据读写共享
当这个DLL被某个进程加载时,程序从WinMain进入,此时我们需要保存模块句柄,如下:

glhInstance = (HINSTANCE) hModule;
接下来,我们将定义两个导出函数和钩子处理函数。下面重点说一下这个钩子处理函数(另外两个导出函数比较简单,就是通过调用SetWindowsHookEx和UnhookWindowsHookEx来实现安装/卸载钩子函数;只要注意SetWindowsHookEx的第一个参数是WH_KEYBOARD_LL,第四个参数是0).
// 低级键盘钩子处理函数
LALL回调LowLevelKeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
BOOL fEatKeystroke = FALSE;
PKBDLLHOOKSTRUCT p = NULL;
if (nCode == HC_ACTION)
{
p = (PKBDLLHOOKSTRUCT) lParam;
开关(wParam)

{
案例 WM_KEYDOWN:
案例 WM_SYSKEYDOWN:
案例 WM_KEYUP:
案例 WM_SYSKEYUP:
fEatKeystroke = (p->vkCode == VK_LWIN) ¦ ¦ (p->vkCode == VK_RWIN) ¦ // 块赢
// 阻止 Alt+Tab
((p->vkCode == VK_TAB) && ((p->flags & LLKHF_ALTDOWN) != 0)) ¦
// 阻止 Alt+Esc
((p->vkCode == VK_ESCAPE) && ((p->flags & LLKHF_ALTDOWN) != 0)) ||
// 块 Ctrl+Esc

((p->vkCode == VK_ESCAPE) && ((GetKeyState(VK_CONTROL) & 0x8000) != 0));
中断;
默认:
中断;
}
}
return (fEatKeystroke? TRUE: CallNextHookEx(glhHook,nCode,wParam,lParam));
}
如您所见,当程序发现按下了 Win 键或 Alt+Tab 组合键时,它不会调用 CallNextHookEx 函数将消息向下传递。通过这种方式,我们已经能够阻止这些按钮的响应。
第二步是hook DLL 测试程序。在 VC 中创建一个基于对话框的应用程序。调用LoadLibrary("KeyMask.dll")加载钩子DLL,通过GetProcAddress(m_hDll,"StartKeyMask")和GetProcAddress(m_hDll,"StopKeyMask")导入两个安装/卸载钩子的函数。在主对话框上定义两个按钮以分别调用这两个函数,如下所示:
当按下“Start_Hook”按钮时,我们的钩子函数就起作用了。试试 Win 键,或者 Alt+Tab 组合键,它没有反应,对吧? ! “Stop_Hook”按钮可以移除这个钩子。
说到这里,你可能会觉得hook其实是很简单的东西。是的,钩子易于使用且功能强大。但是,我建议如果不是绝对必要,尽量少使用钩子。由于钩子实现了强大的功能,它们也可能会严重降低您的系统性能。有时候得不偿失!
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/bofangqi/article-378891-1.html
如果他要耍赖
二小时灭中国东海舰队