1. 程式人生 > >MFC:XP下遮蔽Ctrl+Alt+Del等組合鍵的方法

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視窗回撥函式。從而實現遮蔽了我們所能想到的所有系統熱鍵。