編程愛好者一定經常見到能夠隱藏桌面項目和狀態欄等的軟件,其中最著名的就是Hide-It。其實我們能夠編寫一個功能更加強大的即時超級隱藏引擎,它不僅可以隱藏桌面項目、開始按鈕、狀態欄、時鐘欄,而且可以隱藏任何軟件的按鈕、菜單、工具欄、文本框、狀態欄等等,只要是能夠看見的獨立部分——當然也可以輕松的將它們恢復出來。操作更是方便到了點擊“開始隱藏”按鈕,然後將鼠標放到需要隱藏的項目上,按下F12鍵即可——點哪就隱藏哪——這也是我稱之為“隱藏引擎”的原因。
一、編程原理
(1)WINDOWSAPI函數ShowWindow可以實現對程序界面(包括WINDOWS9X和其他應用軟件)以及子項目的顯示控制,通過調用相關消息常數SW_HIDE=0(隱藏)和SW_SHOW=5(顯示)就可以執行對指定界面項目的隱藏和重新顯示出來。它所需要的另外一個參數是被隱藏項目的句柄;
(2)GetCursorPos函數能夠返回當前鼠標所在位置的屏幕坐標,而函數WindowFromPointXY恰好能夠根據屏幕坐標返回該位置的窗體項目句柄——這正是我們所需要的!
(3)為了方便操作,我們需要為它注冊一個系統級工作(激活)熱鍵,我選擇了F12;SetWindowLong、GetWindowLong、CallWindowProc、RegisterHotKey、UnregisterHotKey是五個必須的熱鍵注冊、反注冊函數;使用它們一定要小心謹慎,否則可能會導致開發平台的暫時崩潰,你不得不看到“該程序執行了非法操作,即將被關閉”的警示窗口,而且你的工作成果會立即化為烏有;但是如果你按照本文的編寫方法,保你“一路平安”;
(4)為了方便“記憶力”不好的朋友,我們需要一個列表框來顯示已經被隱藏的項目的句柄,以便能夠適當、必要的提醒。
二、編程實踐
(1)啟動vb6,建立一個標准exe工程,添加一個窗體CHINAHIDE,添加四個command控件hideOK對應“開始隱藏”、unhide對應“恢復一個”、uNhideall對應“全部恢復”;添加listbox控件list1(用來紀錄句柄);兩個標簽控件用來顯示有關提示信息。調整上述控件到適當位置和合適大小,雙擊窗體,寫入以下代碼:
DimLasthWndAsInteger'被隱藏項目句柄
PrivateSubForm_Load()
'程序啟動時注冊功能熱鍵F12
preWinProc=GetWindowLong(Me.hwnd,GWL_WNDPROC)
SetWindowLongMe.hwnd,GWL_WNDPROC,AddressOfWndproc
uVirtKey=vbKeyF12
RegisterHotKeyMe.hwnd,1,Modifiers,uVirtKey
EndSub
PrivateSubuNhideall_Click()
'恢復所有被隱藏項目
Forres=0ToList1.ListCount-1
LasthWnd=List1.List(res)
ShowWindowLasthWnd,SW_SHOW
Nextres
List1.Clear
'清空句柄列表框
EndSub
PublicSubhideOK_Click()
'當"開始隱藏"按鈕被點擊時,將窗口最小化
Me.WindowState=1
EndSub
PrivateSubUNHIDE_Click()
'恢復一個選定的被隱藏項目
IfList1.ListIndex<0Then
MsgBox"請首先選擇一個被恢復的隱藏項目!",vbExclamation
ExitSub
EndIf'驗證句柄列表欄目是否已經被選中
hideINDEX=List1.ListIndex
LasthWnd=List1.List(hideINDEX)
X=ShowWindow(LasthWnd,SW_SHOW)
'恢復選定的被隱藏項目
List1.RemoveItem(hideINDEX)
'移除該項目有關信息
EndSub
PrivateSubForm_Unload(CancelAsInteger)
'當程序被關閉時,取消已經注冊的熱鍵
SetWindowLongMe.hwnd,GWL_WNDPROC,preWinProc
UnregisterHotKeyMe.hwnd,uVirtKey
'取消系統級熱鍵,釋放資源
End'終止程序運行
EndSub
'主窗體代碼結束
(2)添加一個標准模塊,命名為MOULDLE1,寫入以下代碼:
PublicDeclareFunctionSetWindowLongLib"user32"Alias"SetWindowLongA"(ByValhwndAsLong,ByValnIndexAsLong,ByValdwNewLongAsLong)AsLong
'在窗口結構中為指定的窗口設置信息
PublicDeclareFunctionGetWindowLongLib"user32"Alias"GetWindowLongA"(ByValhwndAsLong,ByValnIndexAsLong)AsLong
'從指定窗口的結構中取得信息
PublicDeclareFunctionCallWindowProcLib"user32"Alias"CallWindowProcA"(ByVallpPrevWndFuncAsLong,ByValhwndAsLong,ByValMsgAsLong,ByValwParamAsLong,ByVallParamAsLong)AsLong
'運行指定的進程
PublicDeclareFunctionRegisterHotKeyLib"user32"(ByValhwndAsLong,ByValIDAsLong,ByValfsModifiersAsLong,ByValvkAsLong)AsLong
'向系統注冊一個指定的熱鍵
PublicDeclareFunctionUnregisterHotKeyLib"user32"(ByValhwndAsLong,ByValIDAsLong)AsLong
'取消熱鍵並釋放占用的資源
'上述五個API函數是注冊系統級熱鍵所必需的,具體實現過程如後文所示
PublicDeclareFunctionShowWindowLib"user32"(ByValhwndAsLong,ByValnCmdShowAsLong)AsLong
'本函數是實現隱藏的核心,參數HWND既是需要隱藏項目的句柄
'nCmdShow參數可以決定使隱藏還是顯示
PublicDeclareFunctionGetCursorPosLib"user32"(lpPointAsPOINTAPI)AsLong
'本函數得到當前鼠標所在位置的屏幕坐標
PublicDeclareFunctionWindowFromPointXYLib"user32"Alias"WindowFromPoint"(ByValxPointAsLong,ByValyPointAsLong)AsLong
'本函數根據屏幕坐標返回被隱藏項目的句柄
PublicTypePOINTAPI
XAsLong
YAsLong
EndType'鼠標坐標類型定義
PublicConstSW_HIDE=0'隱藏常數
PublicConstSW_SHOW=5'顯示常數
PublicConstWM_HOTKEY=&H312
'熱鍵標志常數,用來判斷當鍵盤按鍵被按下時是否命中了我們設定的熱鍵
PublicConstGWL_WNDPROC=(-4)
PublicpreWinProcAsLong,MyhWndAsLong,uVirtKeyAsLong
'定義系統的熱鍵,原中斷標示,被隱藏的項目句柄
'請緊記下面的熱鍵攔截函數,它將對你將來編寫WINDOWS32高級控制程序大有幫助!
PublicFunctionWndproc(ByValhwndAsLong,ByValMsgAsLong,ByValwParamAsLong,ByVallParamAsLong)AsLong
'熱鍵攔截過程
IfMsg=WM_HOTKEYThen'如果攔截到熱鍵標志常數
IfwParam=1Then
'如果是我們的定義的熱鍵F12...
'為了節省篇幅,我對熱鍵攔截處理不是非常嚴密...
hideDONE
'執行隱藏鼠標所指項目
EndIf
EndIf
'如果不是熱鍵,或者不是我們設置的熱鍵,交還控制權給
'系統,繼續監測熱鍵
Wndproc=CallWindowProc(preWinProc,hwnd,Msg,wParam,lParam)
EndFunction
PublicSubhideDONE()'最關鍵的項目隱藏過程
PublicSubhideDONE()
Dimpt32AsPOINTAPI
GetCursorPospt32''得到鼠標屏幕坐標
MyhWnd=WindowFromPointXY(pt32.X,pt32.Y)
''得到所在位置窗體項目句柄
IfMyhWnd=Chinahide.hwndThenExitSub
'拒絕隱藏程序自身
Chinahide.List1.AddItem(MyhWnd)
''添加相關信息
ShowWindowMyhWnd,SW_HIDE
'執行隱藏功能
EndSub
‘模塊結束
本文代碼不僅將向編程愛好者展示“隱藏引擎”的魅力,也將讓您立刻成為一個後台控制和系統級熱鍵的編程高手。它適用於windows95/98/nt4/me/2000,vb5/6開發平台。
看到這裡,你一定會想到能夠將它應用到哪裡了吧(譬如加個密碼就可以保護你的桌面!)——心動不如行動,DOITBYYOUSELF!
->