欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

c語言鉤子函數(shù)示例,鉤子函數(shù) 設(shè)計(jì)模式

C語言 鉤子是什么?

就是hook,用來監(jiān)視和撲捉系統(tǒng)的消息,這樣可以在系統(tǒng)消息還沒送達(dá)之前就做預(yù)處理,比如你想撲捉系統(tǒng)全局的鍵盤消息,鼠標(biāo)消息等等,就可以用hook來實(shí)現(xiàn)

創(chuàng)新互聯(lián)是一家專業(yè)的成都網(wǎng)站建設(shè)公司,我們專注成都網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、外貿(mào)營銷網(wǎng)站建設(shè)、網(wǎng)絡(luò)營銷、企業(yè)網(wǎng)站建設(shè),買友情鏈接廣告投放為企業(yè)客戶提供一站式建站解決方案,能帶給客戶新的互聯(lián)網(wǎng)理念。從網(wǎng)站結(jié)構(gòu)的規(guī)劃UI設(shè)計(jì)到用戶體驗(yàn)提高,創(chuàng)新互聯(lián)力求做到盡善盡美。

C語言newHook字段

C語言newHook字段:typedefHMODULE(WINAPI*HOOKAPI)(INLPCSTR);

#defineMYHOOKMETHOD(__fun)HMODULEWINAPI__fun

#defineDECLARE_REGISTER(__0bj,__lawfunc,__newfunc)Inline_Hook__Obj(__lawfunc,__newfunc)。

鉤子(Hook),是Windows消息處理機(jī)制的一個(gè)平臺(tái),應(yīng)用程序可以在上面設(shè)置子程以監(jiān)視指定窗口的某種消息,而且所監(jiān)視的窗口可以是其他進(jìn)程所創(chuàng)建的。當(dāng)消息到達(dá)后,在目標(biāo)窗口處理函數(shù)之前處理它。鉤子機(jī)制允許應(yīng)用程序截獲處理window消息或特定事件。

鉤子實(shí)際上是一個(gè)處理消息的程序段,通過系統(tǒng)調(diào)用,把它掛入系統(tǒng)。每當(dāng)特定的消息發(fā)出,在沒有到達(dá)目的窗口前,鉤子程序就先捕獲該消息,亦即鉤子函數(shù)先得到控制權(quán)。這時(shí)鉤子函數(shù)即可以加工處理(改變)該消息,也可以不作處理而繼續(xù)傳遞該消息,還可以強(qiáng)制結(jié)束消息的傳遞。

Hook技術(shù)又叫做鉤子函數(shù),在系統(tǒng)沒有調(diào)用該函數(shù)之前,鉤子程序就先捕獲該消息,鉤子函數(shù)先得到控制權(quán),這時(shí)鉤子函數(shù)既可以加工處理(改變)該函數(shù)的執(zhí)行行為,還可以強(qiáng)制結(jié)束消息的傳遞。簡單來說,就是把系統(tǒng)的程序拉出來變成我們自己執(zhí)行代碼片段。

要實(shí)現(xiàn)鉤子函數(shù),有兩個(gè)步驟:

1.利用系統(tǒng)內(nèi)部提供的接口,通過實(shí)現(xiàn)該接口,然后注入進(jìn)系統(tǒng)(特定場景下使用)

2.動(dòng)態(tài)代理(使用所有場景)

?

鍵盤鉤子怎么 使用

I:設(shè)置鉤子

設(shè)置鉤子是通過SetWindowsHookEx ()的API函數(shù).

原形: HHOOK SetWindowsHookEx(int idHook,HOOKPROC lpfn,HINSTANCE hMod,DWORD dwThreadId)

idhook:裝入鉤子的類型.

lpfn: 鉤子進(jìn)程的入口地址

hMod: 應(yīng)用程序的事件句柄

dwThreadId: 裝入鉤子的線程標(biāo)示

參數(shù):

idHook:

這個(gè)參數(shù)可以是以下值:

WH_CALLWNDPROC、WH_CALLWNDPROCRET、WH_CBT、WH_DEBUG、WH_FOREGROUNDIDLE、WH_GETMESSAGE、WH_JOURNALPLAYBACK、WH_JOURNALRECORD、WH_KEYBOARD、WH_KEYBOARD_LL、WH_MOUSE、WH_MOUSE_LL、WH_MSGFILTER、WH_SHELL、WH_SYSMSGFILTER。

對于這些參數(shù),我不想一一加以解釋,因?yàn)镸SDN中有關(guān)于他們的詳細(xì)注解。我只挑選其中的幾個(gè)加以中文說明。

WH_KEYBOARD:一旦有鍵盤敲打消息(鍵盤的按下、鍵盤的彈起),在這個(gè)消息被放在應(yīng)用程序的消息隊(duì)列前,WINDOWS將會(huì)調(diào)用你的鉤子函數(shù)。鉤子函數(shù)可以改變和丟棄鍵盤敲打消息。

WH_MOUSE:每個(gè)鼠標(biāo)消息在被放在應(yīng)用程序的消息隊(duì)列前,WINDOWS將會(huì)調(diào)用你的鉤子函數(shù)。鉤子函數(shù)可以改變和丟棄鼠標(biāo)消息。

WH_GETMESSAGE:每次當(dāng)你的應(yīng)用程序調(diào)用一個(gè)GetMessage()或者一個(gè)PeekMessage()為了去從應(yīng)用程序的消息隊(duì)列中要求一個(gè)消息時(shí),WINDOWS都會(huì)調(diào)用你的鉤子函數(shù)。而鉤子函數(shù)可以改變和丟棄這個(gè)消息。

II:釋放鉤子

鉤子的釋放使用的是UnhookWindowsHookEx()函數(shù)

原形:BOOL UnhookWindowsHookEx( HHOOK hhk )

UnhookWindowsHookEx()函數(shù)將釋放的是鉤子鏈中函數(shù)SetWindowsHookEx所裝入的鉤子進(jìn)程。

hhk: 將要釋放的鉤子進(jìn)程的句柄。

III:鉤子進(jìn)程

鉤子進(jìn)程使用函數(shù)HookProc;其實(shí)HookProc僅僅只是應(yīng)用程序定義的符號。比如你可以寫成KeyBoardHook.但是參數(shù)是不變的。Win32 API提供了諸如:CallWndProc、GetMsgProc、DebugProc、CBTProc、MouseProc、KeyboardProc、MessageProc等函數(shù),對于他們的詳細(xì)講解,可以看MSDN我在此只講解一下KeyBoardHook的含義。

原形:LRESULT CALLBACK KeyBoardHook (int nCode, WPARAM wParam, LPARAM lParam)

說明:鉤子進(jìn)程是一些依附在一個(gè)鉤子上的一些函數(shù),因此鉤子進(jìn)程只被WINDOWS調(diào)用而不被應(yīng)用程序調(diào)用,他們有時(shí)就需要作為一個(gè)回調(diào)函數(shù)(CALLBACK)。

參數(shù)說明:

nCode:鉤子代碼,鉤子進(jìn)程使用鉤子代碼去決定是否執(zhí)行。而鉤子代碼的值是依靠鉤子的種類來定的。每種鉤子種類都有他們自己一系列特性的代碼。比如對于WH_KEYBOARD,鉤子代碼的參數(shù)有:HC_ACTION,HC_NOREMOVE。HC_ACTION的意義:參數(shù)wParam 和lParam 包含了鍵盤敲打消息的信息,HC_NOREMOVE的意義:參數(shù)wParam 和lParam包含了鍵盤敲打消息的信息,并且,鍵盤敲打消息一直沒有從消息隊(duì)列中刪除。(應(yīng)用程序調(diào)用PeekMessage函數(shù),并且設(shè)置PM_NOREMOVE標(biāo)志)。也就是說當(dāng)nCode等于HC_ACTION時(shí),鉤子進(jìn)程必須處理消息。而為HC_NOREMOVE時(shí),鉤子進(jìn)程必須傳遞消息給CallNextHookEx函數(shù),而不能做進(jìn)一步的處理,而且必須有CallNextHookEx函數(shù)的返回值。

wParam:鍵盤敲打所產(chǎn)生的鍵盤消息,鍵盤按鍵的虛擬代碼。

lParam:包含了消息細(xì)節(jié)。

注意:如果鉤子進(jìn)程中nCode小于零,鉤子進(jìn)程必須返回(return) CallNextHookEx(nCode,wParam,lParam);而鉤子進(jìn)程中的nCode大于零,但是鉤子進(jìn)程并不處理消息,作者推薦你調(diào)用CallNextHookEx并且返回該函數(shù)的返回值。否則,如果另一個(gè)應(yīng)用程序也裝入WH_KEYBOARD 鉤子,那么該鉤子將不接受鉤子通知并且返回一個(gè)不正確的值。如果鉤子進(jìn)程處理了消息,它可能返回一個(gè)非零值去阻止系統(tǒng)傳遞該信息到其它剩下的鉤子或者windows進(jìn)程。所以最好在鉤子進(jìn)程的最后都返回CallNextHookEx的返回值。

IV:調(diào)用下一個(gè)鉤子函數(shù)

調(diào)用下一個(gè)鉤子函數(shù)時(shí)使用CallNexHookEx函數(shù)。

原形:LRESULT CallNextHookEx( HHOOK hhk, int nCode, WPARAM wParam, LPARAM lParam )

CallNexHookEx()函數(shù)用于對當(dāng)前鉤子鏈中的下一個(gè)鉤子進(jìn)程傳遞鉤子信息,一個(gè)鉤子進(jìn)程既可以在鉤子信息處理前,也可以在鉤子信息處理后調(diào)用該函數(shù)。為什么使用該函數(shù)已在iii鉤子進(jìn)程中的“注意”中,加以了詳細(xì)的說明。

hhk: 當(dāng)前鉤子的句柄

nCode: 傳送到鉤子進(jìn)程的鉤子代碼。

wParam:傳送到鉤子進(jìn)程的值。

lParam:傳送到鉤子進(jìn)程的值。

參數(shù):

hhk: 當(dāng)前鉤子的句柄. 應(yīng)用程序接受這個(gè)句柄,作為先前調(diào)用SetWindowsHookE函數(shù)的結(jié)果

nCode: 傳送到鉤子進(jìn)程的鉤子代碼,下一個(gè)鉤子進(jìn)程使用這個(gè)代碼以此決定如何處理鉤子信息

wParam:傳送給鉤子進(jìn)程的wParam 參數(shù)值 ,參數(shù)值的具體含義與當(dāng)前鉤子鏈的掛接的鉤子類型有關(guān)

lParam : 傳送給鉤子進(jìn)程的wParam 參數(shù)值 ,參數(shù)值的具體含義與當(dāng)前鉤子鏈的掛接的鉤子類型有關(guān)

返回值:返回值是鏈中下一個(gè)鉤子進(jìn)程返回的值,當(dāng)前鉤子進(jìn)程必須返回這個(gè)值,返回值的具體含義與掛接的鉤子類型有關(guān),詳細(xì)信息請參看具體的鉤子進(jìn)程描述。

V 建立一個(gè)動(dòng)態(tài)連接庫(DLL)

當(dāng)我們熟悉了以上的各個(gè)函數(shù)后,現(xiàn)在我們開始編寫一個(gè)動(dòng)態(tài)連接庫(DLL)。在這兒我采用的是WIN32 DLL,而不是MFC DLL。而且以下所有的程序也都是采用C語言去編寫。這主要是因?yàn)槭褂肳IN32 API能夠更詳細(xì)、更全面的控制程序的如何執(zhí)行,而使用MFC,一些低級的控制是不可能實(shí)現(xiàn)的(當(dāng)然,僅對該程序來說,也是可以使用MFC的)。

1:建立一個(gè)動(dòng)態(tài)連接庫的.cpp文件。比如我們現(xiàn)在建立一個(gè)名為hookdll.cpp的文件。在hookdll.cpp的文件中加上如下內(nèi)容:

#include windows.h

#include "string.h"

#include "stdio.h"

HINSTANCE hInst;

#pragma data_seg("hookdata")

HHOOK oldkeyhook=0;

#pragma data_seg()

#pragma comment(linker,"/SECTION:hookdata,RWS")

#define DllExport extern "C"__declspec(dllexport)

DllExport LRESULT CALLBACK KeyBoardProc(int nCode,WPARAM wParam, LPARAM lParam );

DllExport void InstallHook(int nCode);

DllExport void EndHook(void);

BOOL WINAPI DllMain(HINSTANCE hInstance,ULONG What,LPVOID NotUsed)

{

switch(What)

{

case DLL_PROCESS_ATTACH:

hInst = hInstance;

break;

case DLL_PROCESS_DETACH:

break;

case DLL_THREAD_ATTACH:

break;

case DLL_THREAD_DETACH:

break;

}

return 1;

}

void InstallHook(int nCode)

{

oldkeyhook = SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyBoardProc,hInst,0);

}

DllExport LRESULT CALLBACK KeyBoardProc(int nCode,WPARAM wParam, LPARAM lParam )

{

WPARAM j;

FILE *fp;

if(lParam0x80000000)

{

j = wParam;

fp=fopen("c:\hook\key.txt","a");

fprintf(fp,"%4d",j);

fclose(fp);

}

return CallNextHookEx(oldkeyhook,nCode,wParam,lParam);

}

void EndHook(void)

{

UnhookWindowsHookEx(oldkeyhook);

}

這個(gè)動(dòng)態(tài)連接庫的源代碼hookdll.cpp包含了鍵盤處理函數(shù),設(shè)置鉤子,退出鉤子函數(shù)。并將鍵盤敲下的鍵以值的格式存入到c:hookkey.txt文件中。以下是對該文件的詳細(xì)的解釋。

使用包含在DLL的函數(shù),必須將其導(dǎo)入。導(dǎo)入操作時(shí)通過dllimport來完成的,dllexport和dllimport都是vc(visual C++)和bc(Borland C++)所支持的擴(kuò)展的關(guān)鍵字。但是dllexport和dllimport關(guān)鍵字不能被自身所使用,因此它的前面必須有另一個(gè)擴(kuò)展關(guān)鍵字__declspec。通用格式如下:__declspec(specifier)其中specifier是存儲(chǔ)類標(biāo)示符。對于DLL,specifier將是dllexport和dllimport。而且為了簡化說明導(dǎo)入和導(dǎo)出函數(shù)的語句,用一個(gè)宏名來代替__declspec.在此程序中,使用的是DllExport。如果用戶的DLL被編譯成一個(gè)C++程序,而且希望C程序也能使用它,就需要增加“C”的連接說明。#define DllExport extern "C"__declspec(dllexport),這樣就避免了標(biāo)準(zhǔn)C++命名損壞。(當(dāng)然,如果讀者正在編譯的是C程序,就不要加入extern “C”,因?yàn)椴恍枰揖幾g器也不接受它)。有了宏定義,現(xiàn)在就可以用一個(gè)簡單的語句就可以導(dǎo)出函數(shù)了,比如:

DllExport LRESULT CALLBACK KeyBoardProc(int nCode,WPARAM wParam, LPARAM lParam );DllExport void InstallHook(int nCode);DllExport void EndHook(void);

第一個(gè)#pragma 語句創(chuàng)造數(shù)據(jù)段,這里命名為hookdata。其實(shí)也可以命名為您喜歡的任意的一個(gè)名稱。#pragma 語句之后的所有初始化的變量都進(jìn)入hookdata段中。第二個(gè)#pragma語句是數(shù)據(jù)段的結(jié)束標(biāo)志。對變量進(jìn)行專門的初始化是很重要的,否則編譯程序?qū)阉鼈兎旁谄胀ǖ奈闯跏蓟亩沃卸皇欠旁趆ookdata中。

但是鏈接程序必須直到有一個(gè)hookdata段。我們可以在Project Setting(vc6.0) 對話框中選擇Link選項(xiàng),選中HOOKDLL時(shí)在Project Options域(在Release 和Debug配置中均可),包含下面的連接語句:/SECTION:hookdata,RWS字母RWS是表明該段具有讀、寫、和共享屬性。當(dāng)然,您也可以直接用DLL源代碼指定鏈接程序就像HOOKDLL.c那樣:#pragma comment(linker,"/SECTION:hookdata,RWS")。

由于有些DLL需要特殊的啟動(dòng)和終止代碼。為此,所有的DLL都有一個(gè)名為DllMain()的函數(shù),當(dāng)初始化或終止DLL時(shí)調(diào)用該函數(shù)。一般在動(dòng)態(tài)連結(jié)庫的資源文件中定義此函數(shù)。不過如果沒有定義它,則編譯器會(huì)自動(dòng)提供缺省的形式。

原型為:BOOL WINAPI DllMain(HINSTANCE hInstance,ULONG What,LPVOID NotUsed)

參數(shù):

hInstance:DLL實(shí)例句柄

What:指定所發(fā)生的操作

NotUsed:保留參數(shù)

其中What的值可以為以下值:

DLL_PROCESS_ATTACH:進(jìn)程開始使用DLL

DLL_PROCESS_DETACH:進(jìn)程正在釋放DLL

DLL_THREAD_ATTACH:進(jìn)程已創(chuàng)建一個(gè)新的線程

DLL_THREAD_DETACH:進(jìn)程已舍棄了一個(gè)線程

總的來說,無論何時(shí)調(diào)用DllMain()函數(shù),都必須根據(jù)What的內(nèi)容來采取適當(dāng)?shù)膭?dòng)作。這種適當(dāng)?shù)膭?dòng)作可以什么都不做,但不是返回非零值。

DllMain()接下來的便是設(shè)置鉤子,鍵盤處理,和釋放鉤子。

2:建立頭文件

正如應(yīng)用程序所使用的其它任何庫函數(shù)一樣,程序也必須包含dll內(nèi)的函數(shù)的原型。所有得Windows程序都必須包含windows.h的原因。所以我們現(xiàn)在建立一個(gè)頭文件hookdll.h如下:

#define DllImport extern"C"__declspec(dllimport)

DllImport void InstallHook(int nCode);

DllImport LRESULT CALLBACK KeyBoardProc (int nCode,WPARAM wParam, LPARAM lParam );

DllImport void EndHook(void);

使用dllimport主要是為了使代碼更高效,因此推薦使用它。但是在導(dǎo)入數(shù)據(jù)時(shí)是需要dllimport的。當(dāng)完成了上面的程序后,建一個(gè)項(xiàng)目工程,不妨為hookdll,然后將hookdll.c插入導(dǎo)項(xiàng)目工程中,編譯,則可以生成了hookdll.dll和hookdll.lib。

3:建立程序主文件

我們在上面作的所有得工作都是為現(xiàn)在的主程序打得基礎(chǔ)。其實(shí)當(dāng)我們完成了Dll文件后,剩下的就是調(diào)用設(shè)置鉤子函數(shù):InstallHook 。如果你對windows編程十分的熟悉,那么你可以在你任何需要的時(shí)候來調(diào)用InstallHook。但是在你必須記住在你退出程序的時(shí)候你需要調(diào)EndHook以便釋放你所裝入的鉤子函數(shù)。現(xiàn)在我在建立了一個(gè)hookspy.cpp,并將生成好的hookdll.dll和hookdll.lib拷貝到從一個(gè)目錄下,并建立一個(gè)hookspy的項(xiàng)目工程。將hookspy.cpp,hookdll.dll,hookdll.lib,hookdll.h插入到項(xiàng)目工程中去。然后在建立windows窗口時(shí)就將鉤子設(shè)置,在退出程序時(shí)退出鉤子函數(shù)。比如:

case WM_CREATE:

InstallHook(TRUE);

break;

case WM_DESTROY: //terminate the program

EndHook();

PostQuitMessage(0);

break;

本文名稱:c語言鉤子函數(shù)示例,鉤子函數(shù) 設(shè)計(jì)模式
文章起源:http://chinadenli.net/article39/dsiehph.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google網(wǎng)站導(dǎo)航企業(yè)建站云服務(wù)器動(dòng)態(tài)網(wǎng)站定制網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司