什么是鉤子函數(shù)?鉤子函數(shù)的使用。
Windows的鉤子函數(shù)分兩種,一種是全局的,一種是線程的。全局的鉤子函數(shù)可以捕獲任何應(yīng)用程序的消息,但必須是標(biāo)準(zhǔn)的DLL才能實(shí)現(xiàn),VB做不了。VB可以實(shí)現(xiàn)線程的,就是當(dāng)前應(yīng)用程序的消息,這對(duì)鼠標(biāo)消息的捕捉有影響。
SetWindowsHookEx定義如下:
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
idHook是鉤子類型,如WH_KEYBOARD捕捉鍵盤(pán)消息,而WH_MOUSE捕捉鼠標(biāo)消息。hmod用于全局鉤子,VB要實(shí)現(xiàn)鉤子,必須設(shè)為0。dwThreadId用于線程鉤子VB中可以設(shè)置為App.ThreadID。lpfn為鉤子函數(shù),在VB中可以使用AddressOf獲得鉤子函數(shù)的地址。這個(gè)函數(shù)因?yàn)殂^子類型不同而有所不同。如鍵盤(pán)鉤子為:
Public Function KeyboardProc(ByVal nCode As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long
如果Code不為0,鉤子函數(shù)必須調(diào)用CallNextHookEx,將消息傳遞給下面的鉤子。wParam和lParam不是按鍵。
rt thread鉤子函數(shù)怎么用
1.該函數(shù)是一種宏定義,一般用于RTT內(nèi)核代碼. 2.多態(tài)指一個(gè)對(duì)象同時(shí)具有多種形式,一般可以通過(guò)定義子類重寫(xiě)父類方法,然后用父類引用指向子類對(duì)象來(lái)實(shí)現(xiàn). 3.至于self->vfunc(self, a); 就是調(diào)用對(duì)象本身的虛擬函數(shù)…還要怎么解釋.. 4.標(biāo)識(shí)符定義的一種,你可以從頭看一遍書(shū)了.
什么叫做鉤子函數(shù)(易語(yǔ)言)
鉤子函數(shù)是用來(lái)給系統(tǒng)回調(diào)的. 簡(jiǎn)單的說(shuō)就是你注冊(cè)一個(gè)鉤子以后.發(fā)生鉤子注冊(cè)的事件. 系統(tǒng)就調(diào)用你注冊(cè)的鉤子函數(shù)并傳遞參數(shù)給你. 比如你注冊(cè)了一個(gè)鍵盤(pán)鉤子, 當(dāng)用戶按下XX鍵的時(shí)候系統(tǒng)就調(diào)用你注冊(cè)的鉤子函數(shù). 并且把用戶按下了哪些鍵當(dāng)作參數(shù)傳遞過(guò)來(lái). XX小馬就是用這個(gè)來(lái)邪惡的 麻煩采納,謝謝!
誰(shuí)能用c語(yǔ)言寫(xiě)一個(gè)鉤子函數(shù)的例子
//鍵盤(pán)鉤子處理函數(shù)。
extern “C” LRESULT WINAPI KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
if( nCode >= 0 )
{
if( wParam == 0X79 )//當(dāng)按下F10鍵
{
CPoint newPoint,oldPoint;
GetCursorPos(&oldPoint);
newPoint.x = oldPoint.x 40;
newPoint.y = oldPoint.y 10;
SetCursorPos(newPoint.x,newPoint.y);
mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);//模擬按下鼠標(biāo)左鍵。
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);//模擬放開(kāi)鼠標(biāo)左鍵。
keybd_event(VK_SHIFT,MapVirtualKey(VK_SHIFT,0),0,0); //按下SHIFT鍵。
keybd_event(0x52,MapVirtualKey(0x52,0),0,0);//按下R鍵。
keybd_event(0x52,MapVirtualKey(0x52,0),KEYEVENTF_KEYUP,0);//放開(kāi)R鍵。
keybd_event(VK_SHIFT,MapVirtualKey(VK_SHIFT,0),KEYEVENTF_KEYUP,0);//放開(kāi)SHIFT鍵。
SetCursorPos(oldPoint.x,oldPoint.y);
}
}
return CallNextHookEx(glhHook,nCode,wParam,lParam);
}
驅(qū)動(dòng)函數(shù)鉤子是什么東西?
Windows的鉤子函數(shù)分兩種,一種是全局的,一種是線程的。全局的鉤子函數(shù)可以捕獲任何應(yīng)用程序的消息,但必須是標(biāo)準(zhǔn)的DLL才能實(shí)現(xiàn),VB做不了。VB可以實(shí)現(xiàn)線程的,就是當(dāng)前應(yīng)用程序的消息,這對(duì)鼠標(biāo)消息的捕捉有影響。 SetWindowsHookEx定義如下: 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 idHook是鉤子類型,如WH_KEYBOARD捕捉鍵盤(pán)消息,而WH_MOUSE捕捉鼠標(biāo)消息。hmod用于全局鉤子,VB要實(shí)現(xiàn)鉤子,必須設(shè)為0。dwThreadId用于線程鉤子VB中可以設(shè)置為App.ThreadID。lpfn為鉤子函數(shù),在VB中可以使用AddressOf獲得鉤子函數(shù)的地址。這個(gè)函數(shù)因?yàn)殂^子類型不同而有所不同。如鍵盤(pán)鉤子為: Public Function KeyboardProc(ByVal nCode As Long, _ ByVal wParam As Long, _ ByVal lParam As Long) As Long 如果Code不為0,鉤子函數(shù)必須調(diào)用CallNextHookEx,將消息傳遞給下面的鉤子。wParam和lParam不是按鍵。
鉤子函數(shù)有多少種?
應(yīng)該分為 消息鉤子和API/地址鉤子,API/地址鉤子又可以細(xì)分為 inline,IAT,SSDT等,參考bbs.pediy.com
java中如何調(diào)用鉤子函數(shù)
JAVA是運(yùn)行在虛擬機(jī)上的,而鉤子函數(shù)是直接對(duì)操作系統(tǒng)進(jìn)行操作控制的,這也是Java和C的主要區(qū)別之一,Java要實(shí)現(xiàn)鉤子函數(shù)比較麻煩,需要使用JNI技術(shù),就是Java本地接口,調(diào)用C寫(xiě)的鉤子函數(shù),所以你還有學(xué)會(huì)用C寫(xiě)一個(gè)鉤子函數(shù),然后再用Java的JNI調(diào)用C
DELPHI中的鉤子是什么?
鉤子是WINDOWS中消息處理機(jī)制的一個(gè)要點(diǎn),經(jīng)由過(guò)程安裝各類鉤子,應(yīng)用法度榜樣可以或許設(shè)置響應(yīng)的子例程來(lái)監(jiān)督體系里的消息傳遞以及在這些消息達(dá)到目標(biāo)窗口法度榜樣之前處理它們。鉤子的種類很多,每種鉤子可以截獲并處理響應(yīng)的消息,如鍵盤(pán)鉤子可以截獲鍵盤(pán)消息,鼠標(biāo)鉤子可以截獲鼠標(biāo)消息,外殼鉤子可以截獲啟犢租閉應(yīng)用法度榜樣的消息,日記鉤子可以監(jiān)督和記錄輸入事宜。鉤子分為線程專用鉤子和全局鉤子,線程專用鉤子只監(jiān)督指定的線程,要監(jiān)督體系中的所有線程,必須用到全局鉤子。對(duì)于全局鉤子,鉤子函數(shù)必須包含在自力的動(dòng)態(tài)鏈接庫(kù)(DLL)中,如許才能被各類相接洽關(guān)系的應(yīng)用法度榜樣調(diào)用。在WINDOWS中,日記鉤子是個(gè)很特其余鉤子,它只有全局鉤子一種,是鍵盤(pán)鼠標(biāo)等輸入設(shè)備的消息在體系消息隊(duì)列被掏出時(shí)產(chǎn)生的,并且體系中只能存在一個(gè)如許的日記鉤子,更重如果,它不必用在動(dòng)態(tài)鏈接庫(kù)中,如許可以省卻了為安裝一個(gè)全局鉤子而建立一個(gè)動(dòng)態(tài)鏈接庫(kù)的麻煩。
thinkphp中的鉤子函數(shù)有什么作用?一般什么用于處理什么業(yè)務(wù)邏輯
鉤子就像是一個(gè)掛載點(diǎn),掛到函數(shù)上。當(dāng)函數(shù)執(zhí)行過(guò)程中遇到這個(gè)掛載點(diǎn),這個(gè)鉤子 就會(huì)將一塊代碼拉出來(lái),執(zhí)行這個(gè)代碼。鉤子函數(shù)相對(duì)于直接在函數(shù)中調(diào)用另外一個(gè)函數(shù)來(lái)說(shuō),更加安全方便。當(dāng)我們需要修改擴(kuò)展功能時(shí),我們無(wú)需修改函數(shù)B中的鉤子,只需要修改鉤子里面的代碼塊即可,而如果直接修改函數(shù)A,則會(huì)對(duì)函數(shù)B所在類進(jìn)行頻繁修改。違背了封閉原則。另一點(diǎn),利用鉤子對(duì)后期的維護(hù)和功能擴(kuò)展更加方便。
thinkphp里面,鉤子就是進(jìn)行行為擴(kuò)展。下面是網(wǎng)上一些對(duì)行為擴(kuò)展的解釋:
行為
行為(Behavior)是一個(gè)比較抽象的概念,你可以想象成在應(yīng)用執(zhí)行過(guò)程中的一個(gè)動(dòng)作或者處理,在框架的執(zhí)行流程中,各個(gè)位置都可以有行為產(chǎn)生,例如路由檢測(cè)是一個(gè)行為,靜態(tài)緩存是一個(gè)行為,用戶權(quán)限檢測(cè)也是行為,大到業(yè)務(wù)邏輯,小到瀏覽器檢測(cè)、多語(yǔ)言檢測(cè)等等都可以當(dāng)做是一個(gè)行為,甚至說(shuō)你希望給你的網(wǎng)站用戶的第一次訪問(wèn)彈出Hello,world!這些都可以看成是一種行為,行為的存在讓你無(wú)需改動(dòng)框架和應(yīng)用,而在外圍通過(guò)擴(kuò)展或者配置來(lái)改變或者增加一些功能。
而不同的行為之間也具有位置共同性,比如,有些行為的作用位置都是在應(yīng)用執(zhí)行前,有些行為都是在模板輸出之后,我們把這些行為發(fā)生作用的位置稱之為標(biāo)簽(位)(tag),當(dāng)應(yīng)用程序運(yùn)行到這個(gè)標(biāo)簽的時(shí)候,就會(huì)被攔截下來(lái),統(tǒng)一執(zhí)行相關(guān)的行為
關(guān)于鉤子函數(shù)的一些問(wèn)題.
不同的鉤子的lParam值有不同的含義,針對(duì)鍵盤(pán)鉤子而言lParam的第29位表示ALT鍵是否被按下,如果是的話,這一位就是1,否則是0;第30位表示按鍵原來(lái)的狀態(tài),如果在消息發(fā)送前按鍵原來(lái)是按下的,則這一位就是1,否則就是0;第31位表示按鍵當(dāng)前的動(dòng)作,如果是按下,這一位就是0,如果是釋放,這一位就是1.做鍵盤(pán)鉤子這些位都有用,你的那個(gè)0x40000000是判斷第30位是不是1的一個(gè)按位的與運(yùn)算,如果第30位為1,才會(huì)執(zhí)行if里的東西.別的你就自己理解吧……希望有幫助