昨天昊哥让我去想办法实现全局屏蔽,也就是要把Alt+Ctrl+Del这个组合键屏蔽。
去CSDN问了一下,得到的结论是Alt+Ctrl+Del这个组合键是系统直接调用,普通方法无法屏蔽。通过试验,用一般的钩子的确无法屏蔽掉。
然后去问老大,老大告诉我两种方法,一种就是驱动键盘过滤,另外一种就是把winlogin.exe挂起。 第一种牵扯到驱动编程,就不弄了(太麻烦了)。
研究第二种。 winlogin.exe是系统进程,负责管理系统的登录。以自己的愚见就是响应这个组合键的。如果将进程挂起,那么组合键就不被响应。和屏蔽一样。找到思路了,就找方法。
挂起线程很简单,因为系统提供了 SuspendThread() API 可以直接调用, MSDN中没有提到挂进程的API。老办法,百度嘛。
找到函数NTSTATUS NtSuspendProcess(HANDLE hProcess);
NTSTATUS NtResumeProcess(HANDLE hProcess);
英语好的一眼就看出是什么意思了(原谅战5的英语渣)。这是Windows Native API,介于Windows API和 内核API之间。本地版msdn是找不到的。属于 NTDLL.DLL 。
接下来就好办了,动态加载
typedef NTSTATUS (_stdcall * AddProc)(HANDLE );
HINSTANCE hInst;
去CSDN问了一下,得到的结论是Alt+Ctrl+Del这个组合键是系统直接调用,普通方法无法屏蔽。通过试验,用一般的钩子的确无法屏蔽掉。
然后去问老大,老大告诉我两种方法,一种就是驱动键盘过滤,另外一种就是把winlogin.exe挂起。 第一种牵扯到驱动编程,就不弄了(太麻烦了)。
研究第二种。 winlogin.exe是系统进程,负责管理系统的登录。以自己的愚见就是响应这个组合键的。如果将进程挂起,那么组合键就不被响应。和屏蔽一样。找到思路了,就找方法。
挂起线程很简单,因为系统提供了 SuspendThread() API 可以直接调用, MSDN中没有提到挂进程的API。老办法,百度嘛。
找到函数NTSTATUS NtSuspendProcess(HANDLE hProcess);
NTSTATUS NtResumeProcess(HANDLE hProcess);
英语好的一眼就看出是什么意思了(原谅战5的英语渣)。这是Windows Native API,介于Windows API和 内核API之间。本地版msdn是找不到的。属于 NTDLL.DLL 。
接下来就好办了,动态加载
typedef NTSTATUS (_stdcall * AddProc)(HANDLE );
HINSTANCE hInst;
hInst=LoadLibrary("ntdll.dll");
AddProc m_Unlock=(AddProc)GetProcAddress(hInst,"NtResumeProcess");//获取Dll的导出函数
AddProc m_Lock=(AddProc)GetProcAddress(hInst,"NtSuspendProcess");//获取Dll的导出函数
AddProc m_Unlock=(AddProc)GetProcAddress(hInst,"NtResumeProcess");//获取Dll的导出函数
AddProc m_Lock=(AddProc)GetProcAddress(hInst,"NtSuspendProcess");//获取Dll的导出函数