利用低級(jí)鍵盤(pán)鉤子實(shí)現(xiàn)計(jì)算機(jī)鎖定_第1頁(yè)
利用低級(jí)鍵盤(pán)鉤子實(shí)現(xiàn)計(jì)算機(jī)鎖定_第2頁(yè)
利用低級(jí)鍵盤(pán)鉤子實(shí)現(xiàn)計(jì)算機(jī)鎖定_第3頁(yè)
利用低級(jí)鍵盤(pán)鉤子實(shí)現(xiàn)計(jì)算機(jī)鎖定_第4頁(yè)
利用低級(jí)鍵盤(pán)鉤子實(shí)現(xiàn)計(jì)算機(jī)鎖定_第5頁(yè)
已閱讀5頁(yè),還剩11頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、利用低級(jí)鍵盤(pán)鉤子實(shí)現(xiàn)計(jì)算機(jī)鎖定對(duì)于用過(guò)Windows的人,幾乎沒(méi)有人不知道Ctrl+Alt+Del組合鍵,尤其是在使用經(jīng)常死機(jī)的Windows9x時(shí),使用它的頻率更高,這一組合鍵是專門(mén)為了系統(tǒng)安全起見(jiàn)提供的緊急出口。本文側(cè)重于介紹在Windows XP中如何實(shí)現(xiàn)屏蔽CTRL+ALT+DEL組合鍵,也就是任務(wù)管理器,任務(wù)切換組合鍵(Alt+Tab),任務(wù)欄和“開(kāi)始”菜單(Ctrl+Esc,VK_LWIN,VK_RWIN)。這個(gè)方法也能應(yīng)用于Windows 2000環(huán)境。    在Windows 9x/Me系統(tǒng)中,屏蔽Ctrl+Alt+Del和各種任務(wù)開(kāi)關(guān)鍵的方法是通

2、過(guò)下面的方法實(shí)現(xiàn)的: BOOL bOldState;SystemParametersInfo(SPI_SETSCREENSAVERRUNNING, TRUE, &bOldState, 0);     MS認(rèn)為這種方法很業(yè)余,所以在Windows NT/2000/XP中對(duì)此進(jìn)行了修改。在這些較新的Windows版本中用戶登陸使用Winlogon和GINAGraphical Identification and Authentication,意思是圖形化的身份認(rèn)證。Winlogon是Windows系統(tǒng)的一部分,它專門(mén)提供交互式登陸支持,而GINA則是Winlo

3、gon用來(lái)實(shí)現(xiàn)認(rèn)證的一個(gè)DLL這個(gè)DLL就是msgina.dll。WlxInitialize、WlxActivateUserShell便是其中輸出,當(dāng)然不知這兩個(gè),還有別的。前者進(jìn)行自身的初始化,后者激活用戶的外殼程序。Windows就是用這個(gè)DLL來(lái)實(shí)現(xiàn)用戶名+口令的身份認(rèn)證的,但是開(kāi)發(fā)人員可以用自己的GINA代替msgina.dll。例如,實(shí)現(xiàn)智能卡、視網(wǎng)膜掃描儀、DNA檢查等等認(rèn)證機(jī)制來(lái)代替輸入用戶名+口令形式的身份檢查。 下面的表格中列出了與GINA有關(guān)的全部函數(shù)。其中有一個(gè)是WlxLoggedOnSAS,當(dāng)按下Ctrl+Alt+Del 鍵時(shí),Winlogon便調(diào)用這個(gè)函數(shù)。 (表一)

4、GINA 函數(shù)一覽表 函數(shù) 描述WlxActivateUserShell激活用戶外殼程序WlxDisplayLockedNotice允許GINA DLL 顯示鎖定信息WlxDisplaySASNotice 當(dāng)沒(méi)有用戶登陸時(shí),Winlogon調(diào)用此函數(shù)WlxDisplayStatusMessageWinlogon 用一個(gè)狀態(tài)信息調(diào)用此函數(shù)進(jìn)行顯示W(wǎng)lxGetConsoleSwitchCredentials Winlogon調(diào)用此函數(shù)讀取當(dāng)前登陸用戶的信任信息,并透明地將它們傳到目標(biāo)會(huì)話WlxGetStatusMessage Winlogon 調(diào)用此函數(shù)獲取

5、當(dāng)前狀態(tài)信息WlxInitialize 針對(duì)指定的窗口位置進(jìn)行GINA DLL初始化WlxIsLockOk 驗(yàn)證工作站正常鎖定WlxIslogoffOk 驗(yàn)證注銷正常WlxLoggedOnSAS 用戶已登陸并且工作站沒(méi)有被加鎖,如果此時(shí)接收到SAS事件,則Winlogon 調(diào)用此函數(shù)WlxLoggedOutSAS 沒(méi)有用戶登陸,如果此時(shí)收到SAS事件,則Winlogon 調(diào)用此函數(shù)WlxLogoff 請(qǐng)求注銷操作時(shí)通知GINA DLL WlxNegotiate 表示當(dāng)前的Winlogon版本是否能使用GINA DL

6、LWlxNetworkProviderLoad 在加載網(wǎng)絡(luò)服務(wù)提供程序收集了身份和認(rèn)證信息后,Winlogon 調(diào)用此函數(shù)WlxRemoveStatusMessage Winlogon 調(diào)用此函數(shù)告訴GINA DLL 停止顯示狀態(tài)信息WlxScreensaverNotify 允許GINA與屏幕保護(hù)操作交互WlxShutdown 在關(guān)閉之前Winlogon 調(diào)用此函數(shù),允許GINA實(shí)現(xiàn)任何關(guān)閉任務(wù),例如從讀卡器中退出智能卡WlxStartApplication 當(dāng)系統(tǒng)需要在用戶的上下文中啟動(dòng)應(yīng)用程序時(shí)調(diào)用此函數(shù)WlxWkstaLockedSAS當(dāng)

7、工作站被鎖定,如果接收到一個(gè)SAS,則Winlogon 調(diào)用此函數(shù)    在默認(rèn)情況下,GINA顯示登陸對(duì)話框,用戶輸入用戶名及口令。所以要想屏蔽掉Ctrl+Alt+Del,則可以寫(xiě)一個(gè)新的MyGina.dll,其中提供接口調(diào)用msgina.dll的函數(shù)WlxLoggedOnSAS,從而實(shí)現(xiàn)Ctrl+Alt+Del屏蔽?;蛘呔帉?xiě)一個(gè)鍵盤(pán)驅(qū)動(dòng)程序來(lái)實(shí)現(xiàn)。     難道屏蔽Ctrl+Alt+Del真的象上述所說(shuō)的那么麻煩嗎?有沒(méi)有更好的方法呢?答案是肯定的。所以忘掉GINA吧,使用操作系統(tǒng)的策略設(shè)置完全可以搞掂這個(gè)問(wèn)題。方法是進(jìn)入&quo

8、t;開(kāi)始"菜單,選擇"運(yùn)行",然后在運(yùn)行對(duì)話框中輸入"gpedit.msc",啟動(dòng)Windows系統(tǒng)的組策略編輯器。在左邊窗格查看"用戶配置|管理模板|系統(tǒng)|登錄/注銷",則在右邊窗格策略里不難發(fā)現(xiàn)"禁用任務(wù)管理器"一項(xiàng)。如圖二所示: 圖一 組策略編輯器 通過(guò)對(duì)這個(gè)策略的設(shè)置可以屏蔽掉Ctrl+Alt+Del。如果要通過(guò)編寫(xiě)代碼來(lái)實(shí)現(xiàn),則必須操作下面的注冊(cè)表項(xiàng): HKCU Software Microsoft Windows CurrentVersion Policies SystemDisableTas

9、kMgr = dword:1 如此設(shè)置之后,則在Windows XP中,如果用戶按下Ctrl+Alt+Del,則會(huì)彈出一個(gè)出錯(cuò)對(duì)話框,如圖二所示: 圖二 錯(cuò)誤信息 注意這里假設(shè)在控制面板中“用戶帳號(hào)”管理的“選擇登錄和注銷選項(xiàng)”設(shè)置啟用了“使用歡迎屏幕”一項(xiàng)。如圖三所示: 圖三 登錄選項(xiàng)     否則,XP將使用Windows的傳統(tǒng)登錄模式,要求用戶輸入帳戶名。并且Ctrl+Alt+Del組合鍵的 行為也和傳統(tǒng)的行為一樣,注冊(cè)表中DisableTaskMgr的設(shè)置也只是將登錄/注銷對(duì)話框中的任務(wù)管理器按鈕屏蔽或置灰。 有人可能會(huì)問(wèn),有關(guān)任務(wù)管理器的文檔又沒(méi)有明確說(shuō)

10、明,那你是怎么知道DisableTaskMgr是用來(lái)禁用任務(wù)管理器的呢?告訴你吧, 我是在使用GPEDIT時(shí)發(fā)現(xiàn)的。GPEDIT是一個(gè)非常有用的工具,不僅可以用它來(lái)編輯策略,還可以用它來(lái)發(fā)現(xiàn)策略。利用這個(gè)工具 可以輕松控制Windows的許多東西,從許可權(quán)限的存取到是否使用IE的傳統(tǒng)外觀,從是否顯示對(duì)話框中的Places Bar到是否用Ctrl+Alt+Del 啟動(dòng)任務(wù)管理器。總之用它可以配置上百個(gè)界面行為,因此它是一個(gè)足以讓系統(tǒng)管理員垂延三尺的工具。 一旦找到了感興趣的策略,那如何知道相應(yīng)的注冊(cè)表位置呢?有兩種方法。第一種是比較粗魯?shù)霓k法:在修改策略的前后將注冊(cè)表輸出到 一個(gè).reg文件,然

11、后比較它們有什么不同。所有的策略無(wú)外乎以下的四個(gè)注冊(cè)表鍵: / 用戶指定HKEY_CURRENT_USERSoftwarePolicies HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionPolicies/ 機(jī)器指定 HKEY_LOCAL_MACHINESoftwarePolicies HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionPolicies     第二種方法是直搗信息源頭-檢查描述策略的管理模板文件(.adm)。下面是Windo

12、ws XP的system.adm文件對(duì) DisableTaskMgr的描述:(Windows 2000對(duì)此的描述稍有不同,其細(xì)節(jié)請(qǐng)參考Windows 2000的資源開(kāi)發(fā)包) CATEGORY !CADOptions #if version >= 4 EXPLAIN !CADOptions_Help #endif KEYNAME "SoftwareMicrosoftWindowsCurrentVersionPoliciesSystem" POLICY !DisableTaskMgr #if version >= 4 SUPPORTED !SUPPORTED_Win

13、2k #endif EXPLAIN !DisableTaskMgr_Help VALUENAME "DisableTaskMgr" END POLICY ; ; More Ctrl+Alt+Del policies here. ;END CATEGORY ; Ctrl+Alt+Del optionsDisableTaskMgr_Help="防止用戶啟動(dòng)''任務(wù)管理器''(Taskmgr.exe)。nn如果該設(shè)置被啟用,并且用戶試圖啟動(dòng)任務(wù)管理器,系統(tǒng)會(huì)顯示消息,解釋是一個(gè)策略禁止了這個(gè)操作。nn任務(wù)管理器讓用戶啟動(dòng)或終止程序,監(jiān)視計(jì)

14、算機(jī)性能,查看及監(jiān)視計(jì)算機(jī)上所有運(yùn)行中的程序 (包含系統(tǒng)服務(wù)), 搜索程序的執(zhí)行文件名,及更改程序運(yùn)行的優(yōu)先順序。"DisableTaskMgr="刪除任務(wù)管理器" 以上是DisableTaskMgr的描述片斷     正是在這段描述中KEYNAME 和VALUENAME指定了注冊(cè)表的鍵值對(duì)。利用這種方法,你可以為自己的應(yīng)用程序創(chuàng)建管理模板和策略,但編輯和瀏覽.adm模板文件的編輯器必須支持Unicode字符。如Notepad或者WordPad等都可以。此外,使用管理模板文件,系統(tǒng)管理員可以用它為整個(gè)組織配置需要的策略由此可以看出,此

15、文件在系統(tǒng)中的地位舉足輕重!有關(guān)模板管理文件格式的詳細(xì)信息請(qǐng)參考平臺(tái)SDK。最后需要強(qiáng)調(diào)的是DisableTaskMgr只是禁用Ctrl+Alt+Del的功能。下面我們來(lái)討論如何捕獲它的按鍵序列。要想截獲Ctrl+Alt+Del,有三種可選擇的方法: · 1、 編寫(xiě)一個(gè)GINA代理;此方法我們?cè)谝院蟮奈恼轮薪榻B。實(shí)際上,ac952_z_cn的個(gè)人專欄文章:“WINDOWS NT/2000下如何屏蔽CTRL+ALT+DEL”使用的就是這種方法。 · 2、 編寫(xiě)一個(gè)鍵盤(pán)驅(qū)動(dòng)程序;本文例子程序使用的方法。 · 3、 用自己的程序代替任務(wù)管理器程序TaskMgr.exe。

16、 屏蔽Ctrl+Alt+Del解決方案的具體實(shí)現(xiàn)細(xì)節(jié)請(qǐng)參考本文的例子代碼。     下面讓我們來(lái)解決屏蔽任務(wù)切換鍵序列的問(wèn)題,這些鍵序列包括Alt+Tab、Ctrl+Esc、Alt+Esc、VK_LWIN/VK_RWIN以及任務(wù)欄。在很早以前的Window 3.1年代,處理這個(gè)問(wèn)題的方法是通過(guò)WM_SYSKEYDOWN實(shí)現(xiàn)。到了Windows 9x時(shí)期,本文前面提到過(guò)對(duì)這個(gè)問(wèn)題的處理方法,使用SPI_SETSCREENSAVERRUNNING。但是進(jìn)入Windows NT 4.0 (SP3 +),Windows 2000以及Windows XP時(shí)代,對(duì)這個(gè)問(wèn)題的處

17、理已經(jīng)有所不同,必須寫(xiě)一個(gè)低級(jí)的鍵盤(pán)驅(qū)動(dòng)鉤子。不要怕,因?yàn)橐獙?shí)現(xiàn)這個(gè)鉤子并不是很難。本文下面會(huì)介紹如何實(shí)現(xiàn)這個(gè)鍵盤(pán)鉤子。一般來(lái)講,系統(tǒng)級(jí)鉤子必須是一個(gè)DLL。下面是本文提供的一個(gè)鍵盤(pán)鉤子DLL的源代碼片斷(TaskKeyHook.dll):頭文件/TaskKeyHook.h/#define DLLIMPORT _declspec(dllimport)DLLIMPORT BOOL DisableTaskKeys(BOOL bEnable, BOOL bBeep);DLLIMPORT BOOL AreTaskKeysDisabled();實(shí)現(xiàn)文件/ TaskKeyHook.cpp/#define

18、_WIN32_WINNT 0x0500 / for KBDLLHOOKSTRUCT#include <afxwin.h> / MFC core and standard components#define DLLEXPORT _declspec(dllexport)/ App (DLL) object/class CTaskKeyHookDll : public CWinApp public: CTaskKeyHookDll() CTaskKeyHookDll() MyDll;/ 下面的代碼表示這一部分在此DLL所有實(shí)例之間共享/ 低級(jí)鍵盤(pán)鉤子一定是系統(tǒng)級(jí)的鉤子/ #pragma

19、data_seg (".mydata")HHOOK g_hHookKbdLL = NULL; / 鉤子句柄BOOL g_bBeep = FALSE; / 按下非法鍵時(shí)蜂鳴響鈴#pragma data_seg ()#pragma comment(linker, "/SECTION:.mydata,RWS") / 告訴鏈接器:建立數(shù)據(jù)共享段/ 低級(jí)鍵盤(pán)鉤子/ 截獲任務(wù)轉(zhuǎn)換鍵:不傳遞直接返回/LRESULT CALLBACK MyTaskKeyHookLL(int nCode, WPARAM wp, LPARAM lp) KBDLLHOOKSTRUCT *pk

20、h = (KBDLLHOOKSTRUCT *) lp; if (nCode=HC_ACTION) BOOL bCtrlKeyDown = GetAsyncKeyState(VK_CONTROL)>>(sizeof(SHORT) * 8) - 1); if (pkh->vkCode=VK_ESCAPE && bCtrlKeyDown) | / Ctrl+Esc / Alt+TAB (pkh->vkCode=VK_TAB && pkh->flags & LLKHF_ALTDOWN) | / Alt+Esc (pkh->vk

21、Code=VK_ESCAPE && pkh->flags & LLKHF_ALTDOWN)| (pkh->vkCode=VK_LWIN | pkh->vkCode=VK_RWIN) / 開(kāi)始菜單 if (g_bBeep && (wp=WM_SYSKEYDOWN|wp=WM_KEYDOWN) MessageBeep(0); / 蜂鳴 return 1; / 不再往CallNextHookEx傳遞,直接返回 return CallNextHookEx(g_hHookKbdLL, nCode, wp, lp);/ 是否屏蔽任務(wù)鍵序列也就是說(shuō)鍵

22、盤(pán)鉤子是否安裝?/ 注:這里假設(shè)沒(méi)有其它鉤子做同樣的事情/DLLEXPORT BOOL AreTaskKeysDisabled() return g_hHookKbdLL != NULL;/ 屏蔽任務(wù)鍵:安裝低級(jí)鍵盤(pán)構(gòu)/ 返回當(dāng)前是否屏蔽標(biāo)志(TRUE/FALSE)/DLLEXPORT BOOL DisableTaskKeys(BOOL bDisable, BOOL bBeep) if (bDisable) if (!g_hHookKbdLL) g_hHookKbdLL = SetWindowsHookEx(WH_KEYBOARD_LL, MyTaskKeyHookLL, MyDll.m_hI

23、nstance, 0); else if (g_hHookKbdLL != NULL) UnhookWindowsHookEx(g_hHookKbdLL); g_hHookKbdLL = NULL; g_bBeep = bBeep; return AreTaskKeysDisabled();     TaskKeyHook 輸出兩個(gè)函數(shù):DisableTaskKeys 和 AreTaskKeysDisabled。前者安裝WH_KEYBOARD_LL 鉤子;后者判斷這個(gè)鉤子是否安裝。此鍵盤(pán)鉤子的處理思路是截獲Alt+Tab,Ctrl+Esc,Alt+Esc以及Win

24、dows 鍵VK_LWIN/VK_RWIN,關(guān)于這兩個(gè)鍵,稍候會(huì)有詳細(xì)描述。當(dāng)鉤子碰到這些鍵時(shí),它直接返回到調(diào)用者,而不是將處理傳遞給CallNextHookEx 。 LRESULT CALLBACK MyTaskKeyHookLL(.) if (/* 任務(wù)鍵*) return 1; / 立即返回 return CallNextHookEx(.);     TaskKeyHook的大部分實(shí)現(xiàn)都很簡(jiǎn)單。只有一個(gè)地方用到了一點(diǎn)小技巧:既使用#pragma data_seg 命名包含全程數(shù)據(jù)的數(shù)據(jù)段,并且用#pragma comment (linker.)告訴鏈接器讓這

25、個(gè)數(shù)據(jù)段為共享段。實(shí)現(xiàn)細(xì)節(jié)請(qǐng)參考源代碼。 本文附帶的例子程序(TrapKeys.exe)匯集了上述幾個(gè)有關(guān)屏蔽鍵盤(pán)按鍵序列的功能,除此之外,它還有一個(gè)功能就是禁用任務(wù)欄。因?yàn)榧热唤昧巳蝿?wù)轉(zhuǎn)換鍵,那么一般來(lái)說(shuō),也必然要禁用任務(wù)欄,否則禁用任務(wù)轉(zhuǎn)換鍵就沒(méi)有意義了。禁用任務(wù)欄的具體方法如下: HWND hwnd = FindWindow("Shell_traywnd", NULL);/找到任務(wù)欄EnableWindow(hwnd, FALSE); / 禁用任務(wù)欄以下是TrapKeys程序的實(shí)現(xiàn)代碼: / TrapKeys.cpp/#include "stdafx.h&

26、quot;#include "resource.h"#include "StatLink.h"#include "TaskKeyMgr.h"/ 主對(duì)話框/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

27、_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(CCm

28、dUI* pCmdUI); afx_msg LRESULT OnKickIdle(WPARAM,LPARAM); DECLARE_MESSAGE_MAP();/ 標(biāo)準(zhǔn)的MFC 對(duì)話框應(yīng)用類代碼。/class CMyApp : public CWinApp public: virtual BOOL InitInstance() / 初始化app:運(yùn)行對(duì)話框 CMyDialog dlg; m_pMainWnd = &dlg; dlg.DoModal(); return FALSE; virtual int ExitInstance() / 為了按全起見(jiàn),在退出程序的時(shí)候,將所有禁用的項(xiàng)目復(fù)

29、原 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) ON_UPDATE_COMMAND_UI(IDC_DISABLE_TASKKEYS, OnUp

30、dateDisableTaskKeys) ON_UPDATE_COMMAND_UI(IDC_DISABLE_TASKBAR, OnUpdateDisableTaskbar) ON_UPDATE_COMMAND_UI(IDC_DISABLE_TASKMGR, OnUpdateDisableTaskMgr) ON_MESSAGE(WM_KICKIDLE,OnKickIdle)END_MESSAGE_MAP()/ 初始化對(duì)話框:子類化超鏈接柄加栽圖標(biāo)/BOOL CMyDialog:OnInitDialog() CDialog:OnInitDialog(); / 初始化超鏈接 m_wndLink1.S

31、ubclassDlgItem(IDC_EMAIL,this); m_wndLink2.SubclassDlgItem(IDC_VCKBASEURL,this); m_wndLink3.SubclassDlgItem(IDC_VCKBASELINK,this); / 自己設(shè)置對(duì)話框圖標(biāo)。MFC不會(huì)為對(duì)話框應(yīng)用程序設(shè)置它 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); SetIcon(m_hIcon, TRUE); / 打圖標(biāo) SetIcon(m_hIcon, FALSE); / 小圖標(biāo) return TRUE;/ 命令/UI 更新處理:寫(xiě)這些

32、東西應(yīng)該很輕松。void CMyDialog:OnDisableTaskKeys() CTaskKeyMgr:Disable(CTaskKeyMgr:TASKKEYS, !CTaskKeyMgr:AreTaskKeysDisabled(), TRUE); / 蜂鳴void CMyDialog:OnUpdateDisableTaskKeys(CCmdUI* pCmdUI) pCmdUI->SetCheck(CTaskKeyMgr:AreTaskKeysDisabled();void CMyDialog:OnDisableTaskbar() CTaskKeyMgr:Disable(CTask

33、KeyMgr:TASKBAR, !CTaskKeyMgr:IsTaskBarDisabled();void CMyDialog:OnUpdateDisableTaskbar(CCmdUI* pCmdUI) pCmdUI->SetCheck(CTaskKeyMgr:IsTaskBarDisabled();void CMyDialog:OnDisableTaskMgr() CTaskKeyMgr:Disable(CTaskKeyMgr:TASKMGR, !CTaskKeyMgr:IsTaskMgrDisabled();void CMyDialog:OnUpdateDisableTaskMgr

34、(CCmdUI* pCmdUI) pCmdUI->SetCheck(CTaskKeyMgr:IsTaskMgrDisabled();/ 要想讓ON_UPDATE_COMMAND_UI正常工作,這是必需的。/ LRESULT CMyDialog:OnKickIdle(WPARAM wp, LPARAM lCount) UpdateDialogControls(this, TRUE); return 0;    按上述方法盡管禁用了任務(wù)欄,但是還有一個(gè)機(jī)關(guān)沒(méi)有處理,那就是按下Windows鍵仍然可以彈出“開(kāi)始”菜單。顯然在處理VK_LWIN之前,任務(wù)欄不會(huì)檢查是否被啟用。

35、一般來(lái)講,如果某個(gè)窗口被屏蔽掉,那么它就不再會(huì)處理用戶在這個(gè)窗口的輸入這就是所謂的禁用(Disable)的含義。通常調(diào)用EnableWindow(FALSE)后自然就達(dá)到了這個(gè)目的。但是處理VK_LWIN/VK_RWIN按鍵的代碼決不會(huì)去檢查任務(wù)欄啟用/禁用狀態(tài)。對(duì)此,本文的處理辦法仍然是利用鍵盤(pán)鉤子。修改一下TaskKeyHook實(shí)現(xiàn),增加對(duì)Windows鍵的捕獲。這樣按下“開(kāi)始”菜單鍵之后什么也不會(huì)發(fā)生。希望沒(méi)有漏掉其它的按鍵。如果哪位讀者發(fā)現(xiàn)漏掉了什么鍵,請(qǐng)和我聯(lián)系,以便把它加到鍵盤(pán)鉤子中去。為了簡(jiǎn)單起見(jiàn),我在類CTaskKeyMgr中封裝了所有禁用的函數(shù)。下面是這個(gè)類的定義擊實(shí)現(xiàn)文件:

36、 TaskKeyMgr/ TaskKeyMgr.h/#pragma once#include "TaskKeyHook.h"/ 使用這個(gè)類禁用任務(wù)鍵,任務(wù)管理器或任務(wù)欄。/ 用相應(yīng)的標(biāo)志調(diào)用Disable,如:CTaskMgrKeys:Disable(CTaskMgrKeys:ALL);/ class CTaskKeyMgr public: enum TASKMGR = 0x01, / 禁用任務(wù)管理器(Ctrl+Alt+Del) TASKKEYS = 0x02, /禁用任務(wù)轉(zhuǎn)換鍵(Alt-TAB, etc) TASKBAR = 0x04, /禁用任務(wù)欄 ALL=0xFFFF

37、 /禁用所有東西L ; static void Disable(DWORD dwItem,BOOL bDisable,BOOL bBeep=FALSE); static BOOL IsTaskMgrDisabled(); static BOOL IsTaskBarDisabled(); static BOOL AreTaskKeysDisabled() return :AreTaskKeysDisabled(); / 調(diào)用 DLL ;CPP實(shí)現(xiàn)/ TaskKeyMgr.cpp/#include "StdAfx.h"#include "TaskKeyMgr.h&qu

38、ot;#define HKCU HKEY_CURRENT_USER/ 用于禁用任務(wù)管理器策略的注冊(cè)表鍵值對(duì)LPCTSTR KEY_DisableTaskMgr = "SoftwareMicrosoftWindowsCurrentVersionPoliciesSystem"LPCTSTR VAL_DisableTaskMgr = "DisableTaskMgr"/ 禁用相關(guān)的任務(wù)鍵/ / dwFlags = 表示禁用什么/ bDisable = 禁用為 (TRUE) ,否則為啟用 (FALSE)/ bBeep = 按下非法鍵是否蜂鳴(指針對(duì)任務(wù)鍵)/void CTaskKeyMgr:Disable(D

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論