鉤子的本質是一段用以處理系統訊息的程式,通過系統呼叫,將其掛入系統。鉤子的種類有很多,每種鉤子可以截獲並處理相應的訊息,每當特定的訊息發出,在到
達目的視窗之前,鉤子程式先行截獲該訊息、得到對此訊息的控制權。此時在鉤子函式中就可以對截獲的訊息進行加工處理,甚至可以強制結束訊息的傳遞。
在本程式中我們需要捕獲在任意視窗上的鍵盤輸入,這就需要採用全域性鉤子以便攔截整個系統的訊息,而全域性鉤子函式必須以dll(動態連線庫)為載體進行封
裝,vc6中有三種形式的mfc dll可供選擇,即regular statically linked to mfc
dll(標準靜態鏈結mfc dll)、regular using the shared mfc
dll(標準動態鏈結mfc dll)以及extension mfc dll(擴充套件mfc dll)。
wh_keyboard;第二個引數標識鉤子函式的入口位址,當鉤子鉤到任何訊息後便呼叫這個函式,即當不管系統的哪個視窗有鍵盤輸入馬上會引起
launcherhook的動作;第三個引數是鉤子函式所在模組的控制代碼,我們可以很簡單的設定其為本應用程式的例項控制代碼;最後乙個引數是鉤子相關函式的
id用以指定想讓鉤子去鉤哪個執行緒,為0時則攔截整個系統的訊息,在本程式中鉤子需要為全域性鉤子,故設定為0。
……
lresult callback launcherhook(int ncode,wparam wparam,lparam lparam)
}
return result;
}
雖然呼叫callnexthookex()是可選的,但呼叫此函式的習慣是很值得推薦的;否則的話,其他安裝了鉤子的應用程式將不會接收到鉤子的通知而且
。(4)鏈結dll庫,即在"project","settings…"的"link"屬性頁內,在"object/librarymodules:"中填
入"launchdll.lib"。再通過"project","add to
project","files…"將launchdll.h新增到工程中來,最後在視類的原始檔keyhook.cpp中加入對其的引用:
#include "launchdll.h"
initinstance()函式中將m_pmainwnd->showwindow(sw_show);改為
m_pmainwnd->showwindow (sw_hide);即可。
四、執行與檢測
編譯執行程式,執行起來之後並無什麼現象,但通過alt+ctrl+del在關閉程式對話方塊內可以找到我們剛編寫完畢的程式"keyhook",隨便在什
麼程式中通過鍵盤輸入字元,然後開啟記錄檔案,我們會發現:通過鍵盤鉤子,我們剛才輸入的字元都被記錄到記錄檔案中了。
小結:系統鉤子具有相當強大的功能,通過這種技術可以對幾乎所有的windows系統訊息進行攔截、監視、處理。這種技術廣泛應用於各種自動監控
靜態載入dll和動態載入dll
一,首先編寫dll 建win32空dll工程 標頭檔案.h extern c declspec dllexport int max int a,int b extern c 解決函式名由於不同編譯器造成的名字匹配問題,通常c 編譯器編譯時會對函式進行改名,而c編譯器不會 extern c decls...
靜態載入dll和動態載入dll
一,首先編寫dll 建win32空dll工程 標頭檔案.h extern c declspec dllexport int max int a,int b extern c 解決函式名由於不同編譯器造成的名字匹配問題,通常c 編譯器編譯時會對函式進行改名,而c編譯器不會 extern c decls...
VC靜態載入DLL和動態載入DLL
a.dll 和a.lib 兩個檔案都有的話可以用靜態載入的方式 message 函式的宣告你應該知道吧,把它的宣告和下面的語句寫到乙個標頭檔案中 pragma comment lib,a.lib 然後你的對話方塊 cpp 中包含這個標頭檔案就可以使用 message 函式了。如果dll 沒有對應的 ...