,歡迎訪問網頁設計愛好者web開發。本文不是講解hook原理的文章,僅是討論一下在vb.net如何調用hook功能,以及vb.net中api使用的變化問題。
由于hook種類較多,本文中以最常用的鍵盤hook為例進行分析。
一、先來看一下在vb中是如何實現的。截的是空格鍵。表現的目標是:一個form,上面有一個textbox,不管焦點是否落在textbox里,按空格鍵,不會在textbox中輸入一個空格,而是變成在textbox中寫入一句話:“hook成功!”
1.在一個module中寫入下列代碼:
調用的api的申明:
declare function setwindowshookex lib "user32" alias "setwindowshookexa" (byval idhook as long, byval lpfn as long, byval hmod as long, byval dwthreadid as long) as long
函數說明:本函數是用于啟動hook設置。
idhook是hook的類型,即處理的消息類型。
lpfn是hook子程(函數或過程)的地址指針。如果dwthreadid參數為0或是一個由別的進程創建的線程的標識,lpfn必須指向dll中的hook子程。除此以外,lpfn可以指向當前進程的一段hook子程代碼(我們利用的就是這個性質)。
hmod是應用程序實例的句柄,標識包含lpfn所指的子程的dll。如果dwthreadid 標識當前進程創建的一個線程,而且子程代碼位于當前進程,hmod必須為null。
dwthreadid是與安裝hook子程相關聯的線程的標識符,如果為0,hook子程與所有的線程關聯。 返回值:函數成功則返回hook子程的句柄,失敗返回null。
declare function unhookwindowshookex lib "user32"  (byval hhook as long) as long
函數說明:    本函數是解除hook之用。hhook是hook函數的句柄。
 
declare function callnexthookex lib "user32" (byval hhook as long, byval ncode as long, byval wparam as long, lparam as any) as long
函數說明:本函數的作用是將當前hook鏈中的hook信息傳遞給下一個hook。
hhook是當前hook的句柄,一個應用程序接收這個句柄,作為先前調用setwindowshookex函數的結果。
ncode指的是傳遞到當前hook過程的hook代碼,下一個hook過程使用這段代碼去決定如何處理hook信息。
wparam指傳遞給當前hook過程的wparam值,它的具體含義是由當前hook鏈中的相關hook的類型決定的。
lparam指傳遞給當前hook過程的lparam值,它的具體含義是由當前hook鏈中的相關hook的類型決定的。
 
2. 定義的常量是:
public hnexthookproc as long
public const wh_keyboard = 2 ‘這個是表明hook的種類是鍵盤hook
public const pm_key_space = &h20 ‘空格鍵
 
3.代碼段
public sub unhookkbd()  ‘解鍵盤hook函數
    if hnexthookproc <> 0 then
       unhookwindowshookex hnexthookproc
       hnexthookproc = 0
    end if
end sub
 
public function enablekbdhook() ‘設置鍵盤hook
    if hnexthookproc <> 0 then
       exit function
    end if
    hnexthookproc = setwindowshookex(wh_keyboard, addressof _
                mykbhfunc, app.hinstance, 0)
    if hnexthookproc <> 0 then
       enablekbdhook = hnexthookproc
    end if
end function
 
public function mykbhfunc(byval icode as long, _
    byval wparam as long, byval lparam as long) as long
   mykbhfunc = 0
   if icode < 0 then
    mykbhfunc = callnexthookex(hnexthookproc, icode, wparam, lparam)
    exit function
  end if
if wparam = pm_key_space then  ''偵測 有沒有按到空格鍵
       mykbhfunc = 1
       ‘加入自己的代碼,用于表明響應
    form1.text1.text=”hook成功!”
   end if
end function
4.在form中的代碼很簡單:
private sub form_load()
    call enablekbdhook
end sub
 
private sub form_unload(cancel as integer)
   call unhookkbd
end sub
打完收工!現在在form窗體狀態下,敲空格鍵,就會響應你在mykbhfunc函數中寫的代碼了。