MFC:XP下屏蔽Ctrl+Alt+Del等组合键的方法



屏蔽Ctrl+Alt+Del等组合键也是一个老生长谈的话题了,95、98系统中有很多方法试用,但是在Xp下就不能用了,而本文则不考虑Win7系统,因为那又是另一种方法了,本文只介绍XP下屏蔽这些组合键的方法。

屏蔽Ctrl+Alt+Del我知道的有两种,一个是直接改写注册表,这个比较简单,也能禁止,但是会有提示“管理员禁止任务管理器”的字样,这是因为直接关闭了系统服务,虽然效果能达到但是不是我们想要的。

还有一种便是注入dll了。今天便详细介绍这个方法。

这个文件所要完成的工作有屏蔽大部分热键,例如:Alt+Esc,Alt+Tab,Ctrl+Tab等,这些常规意义上的热键比较容易屏蔽,直接在全局键盘钩子里实现就可以了。

但是在钩子里是不能屏蔽Ctrl+Alt+Del的,我们就还需要通过远程注入DLL到winlogon进程,修改winlogon桌面下SAS窗口的回调函数,从而捕获该窗口的WM_HOTKEY消息,并屏蔽它,可以实现屏蔽Ctrl+Alt+Del。

这个方法相对复杂,可以解决第一点中存在的问题,但是也有缺陷,那就是除了Ctrl+Alt+Delete外,大多数的其它系统热键,(包括Alt+Tab,Ctrl+Esc及左右两个Windows键)都无法屏蔽。

所以如果我们的程序需要屏蔽大量的系统热键,就应当将以上两个方法结合起来使用。将以上两个方法结合的办法就是把代码通通写到dll里面,然后再一起注入到winlogon进程中。

对于上面所讲的第二点,注入到winlogon进程,没问题,可以很好的完成功能(网上有很多相关的文章及代码)。但对于第一点,如果在一个GUI程序中加载钩子,也没有问题。但现在加载的对象是winlogin进程,这个进程很特殊,它不是GUI进程,也不在系统应用程序所处的Default桌面下,因此在这个进程中加载钩子,需要注意以下几点:

1、在需要注入的DLL代码中的DLL_PROCESS_ATTACH后面开启一个新线程,并在该线程中实现修改SAS窗口回调函数的代码以及设置低级键盘钩子。

2、由于钩子所在的线程为非GUI线程,因此,必须在该线程成功设置钩子以后主动接收并分发收到的消息,否则钩子将不会钩到任何消息

MSG msg;
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}

3、由于该线程创建时默认与winlogon同属一个桌面(winlogon桌面),而其它包括explorer.exe在内的GUI程序都处在Default桌面,Windows中规定程序只能获得针对同一桌面上创建的窗口消息。所以,要让该线程能接收到用户在Default桌面下操作所产生的消息,必须在该线程中使用如下代码将它的桌面设置为Default桌面:

HDESK hDesk = OpenDesktop("Default",0,FALSE,MAXIMUM_ALLOWED);
SetThreadDesktop(hDesk);
CloseHandle(hDesk);

解决了以上三个问题后,就能让注入到winlogon的dll正常工作了,DLL在加载的时候便会开启线程,设置钩子,替换SAS窗口回调函数。从而实现屏蔽了我们所能想到的所有系统热键。

DLL文件源码下载

你可能感兴趣的:(MFC)