程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> Visual Basic語言 >> VB綜合教程 >> 用VB6編寫強力的windows隱藏引擎

用VB6編寫強力的windows隱藏引擎

編輯:VB綜合教程
用VB6編寫強力的windows隱藏引擎

  編程愛好者一定經常見到能夠隱藏桌面項目和狀態欄等的軟件,其中最著名的就是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!

->

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved