C#是面向對象的編程語言,所以鉤子是寫在類中的。
///?<summary>///?設置的鉤子類型
///?</summary>
public?enum?HookType?:?int
{
///?<summary>
///?WH_MSGFILTER?和?WH_SYSMSGFILTER?Hooks使我們可以把守菜單,遷移轉變?
///條,消息框,對話框消息並且發明用戶應用ALT+TAB?or?ALT+ESC?組合鍵切換窗口。?
///WH_MSGFILTER?Hook只能把守傳遞到菜單,遷移轉變條,消息框的消息,以及傳遞到通?
///過安裝了Hook子過程的應用法度建樹的對話框的消息。WH_SYSMSGFILTER?Hook?
///把守所有應用法度消息。?
///WH_MSGFILTER?和?WH_SYSMSGFILTER?Hooks使我們可以在模式輪回時代?
///過濾消息,這等價於在主消息輪回中過濾消息。?
///經由過程調用CallMsgFilter?function可以直接的調用WH_MSGFILTER?Hook。經由過程應用這?
///個函數,應用法度可以或許在模式輪回時代應用雷同的代碼去過濾消息,如同在主消息循?
///環裏壹樣
///?</summary>
WH_MSGFILTER?=?-1,
///?<summary>
///?WH_JOURNALRECORD?Hook用來把守和記錄輸入事務。典範的,可以應用這?
///個Hook記錄連氣兒的鼠標和鍵盤事務,然後經由過程應用WH_JOURNALPLAYBACK?Hook?
///往返放。WH_JOURNALRECORD?Hook是全局Hook,它不克不及象線程特定Hook壹樣?
///應用。WH_JOURNALRECORD是system-wide?local?hooks,它們不會被打針到任何行?
///程地址空間
///?</summary>
WH_JOURNALRECORD?=?0,
///?<summary>
///?WH_JOURNALPLAYBACK?Hook使應用法度可以插入消息到體系消息隊列。可?
///以應用這個Hook回放經由過程應用WH_JOURNALRECORD?Hook記錄下來的連氣兒的鼠?
///標和鍵盤事務。只要WH_JOURNALPLAYBACK?Hook已經安裝,正常的鼠標和鍵盤?
///事務就是無效的。WH_JOURNALPLAYBACK?Hook是全局Hook,它不克不及象線程特定?
///Hook壹樣應用。WH_JOURNALPLAYBACK?Hook返回超時價,這個值告訴體系在處?
///理來自回放Hook當前消息之前須要守候多長時候(毫秒)。這就使Hook可以把握實?
///時事務的回放。WH_JOURNALPLAYBACK是system-wide?local?hooks,它們不會被?
///打針到任何行程地址空間
///?</summary>
WH_JOURNALPLAYBACK?=?1,
///?<summary>
///?在應用法度中,WH_KEYBOARD?Hook用來把守WM_KEYDOWN?and?
///WM_KEYUP消息,這些消息經由過程GetMessage?or?PeekMessage?function返回。可以使?
///用這個Hook來把守輸入到消息隊列中的鍵盤消息
///?</summary>
WH_KEYBOARD?=?2,
///?<summary>
///?應用法度應用WH_GETMESSAGE?Hook來把守從GetMessage?or?PeekMessage函?
///數返回的消息。妳可以應用WH_GETMESSAGE?Hook去把守鼠標和鍵盤輸入,以及?
///其它發送到消息隊列中的消息
///?</summary>
WH_GETMESSAGE?=?3,
///?<summary>
///?把守發送到窗口過程的消息,體系在消息發送到接管窗口過程之前調用
///?</summary>
WH_CALLWNDPROC?=?4,
///?<summary>
///?在以下事務之前,體系都邑調用WH_CBT?Hook子過程,這些事務包含:?
///1.?激活,建樹,燒毀,最小化,最大化,移動,改變尺寸等窗口事務;?
///2.?完成體系指令;?
///3.?來自體系消息隊列中的移動鼠標,鍵盤事務;?
///4.?設置輸入核苦衷務;?
///5.?同步體系消息隊列事務。
///Hook子過程的返回值斷定體系是否容許或者防止這些操縱中的壹個
///?</summary>
WH_CBT?=?5,
///?<summary>
///?WH_MSGFILTER?和?WH_SYSMSGFILTER?Hooks使我們可以把守菜單,遷移轉變?
///條,消息框,對話框消息並且發明用戶應用ALT+TAB?or?ALT+ESC?組合鍵切換窗口。?
///WH_MSGFILTER?Hook只能把守傳遞到菜單,遷移轉變條,消息框的消息,以及傳遞到通?
///過安裝了Hook子過程的應用法度建樹的對話框的消息。WH_SYSMSGFILTER?Hook?
///把守所有應用法度消息。?
///WH_MSGFILTER?和?WH_SYSMSGFILTER?Hooks使我們可以在模式輪回時代?
///過濾消息,這等價於在主消息輪回中過濾消息。?
///經由過程調用CallMsgFilter?function可以直接的調用WH_MSGFILTER?Hook。經由過程應用這?
///個函數,應用法度可以或許在模式輪回時代應用雷同的代碼去過濾消息,如同在主消息循?
///環裏壹樣
///?</summary>
WH_SYSMSGFILTER?=?6,
///?<summary>
///?WH_MOUSE?Hook把守從GetMessage?或者?PeekMessage?函數返回的鼠標消息。?
///應用這個Hook把守輸入到消息隊列中的鼠標消息
///?</summary>
WH_MOUSE?=?7,
///?<summary>
///?當調用GetMessage?或?PeekMessage?來從消息隊列種查詢非鼠標、鍵盤消息時
///?</summary>
WH_HARDWARE?=?8,
///?<summary>
///?在體系調用體系中與其它Hook接洽關系的Hook子過程之前,體系會調用?
///WH_DEBUG?Hook子過程。妳可以應用這個Hook來決意是否容許體系調用與其它?
///Hook接洽關系的Hook子過程
///?</summary>
WH_DEBUG?=?9,
///?<summary>
///?外殼應用法度可以應用WH_SHELL?Hook去接管首要的通知。當外殼應用法度是?
///激活的並且當頂層窗口建樹或者燒毀時,體系調用WH_SHELL?Hook子過程。?
///WH_SHELL?***有5鐘景象:?
///1.?只要有個top-level、unowned?窗口被產生、起感化、或是被摧毀;?
///2.?當Taskbar須要重畫某個按鈕;?
///3.?當體系須要顯示關於Taskbar的壹個法度的最小化情勢;?
///4.?當今朝的鍵盤布局狀況改變;?
///5.?當應用者按Ctrl+Esc去履行Task?Manager(或雷同級此外法度)。?
///遵守常規,外殼應用法度都不接管WH_SHELL消息。所以,在應用法度可以或許接?
///收WH_SHELL消息之前,應用法度必須調用SystemParametersInfo?function註冊它自?
///己
///?</summary>
WH_SHELL?=?10,
///?<summary>
///?當應用法度的前臺線程處於余暇狀況時,可以應用WH_FOREGROUNDIDLE?
///Hook履行低優先級的任務。當應用法度的前臺線程可能要變成余暇狀況時,體系就?
///會調用WH_FOREGROUNDIDLE?Hook子過程
///?</summary>
WH_FOREGROUNDIDLE?=?11,
///?<summary>
///?把守發送到窗口過程的消息,體系在消息發送到接管窗口過程之後調用
///?</summary>
WH_CALLWNDPROCRET?=?12,
///?<summary>
///?把守輸入到線程消息隊列中的鍵盤消息
///?</summary>
WH_KEYBOARD_LL?=?13,
///?<summary>
///?把守輸入到線程消息隊列中的鼠標消息
///?</summary>
WH_MOUSE_LL?=?14
}
public?partial?class?Form1?:?Form
{
public?Form1()
{
InitializeComponent();
}
[DllImport("USER32.DLL")]
private?static?extern?int?CallNextHookEx(IntPtr?hhk,?int?nCode,?IntPtr?wParam,?IntPtr?lParam);//導入鉤子函數消息傳遞的方法
[DllImport("USER32.DLL")]
private?static?extern?IntPtr?SetWindowsHookEx(HookType?idHook,?HookProc?lpfn,?IntPtr?hMod,?int?dwThreadId);//導入設置鉤子的方法
[DllImport("user32.dll",?CharSet?=?CharSet.Auto,?CallingConvention?=?CallingConvention.StdCall)]
private?static?extern?bool?UnhookWindowsHookEx(int?idHook);
//導入卸載鉤子的方法
private?delegate?int?HookProc(int?nCode,?int?wParam,?IntPtr?lParam);?//聲明回調函數
///<summary>
///自定義回調函數
///</summary>
private?int?HookCallback(int?nCode,?IntPtr?wParam,?IntPtr?lParam)
{
MessageBox.Show(nCode.ToString());
//鍵盤按下時
if?(nCode?>=?0?&&?wParam?==?(IntPtr)0)
{
int?vkCode?=?Marshal.ReadInt32(lParam); Keys?key?=?(Keys)vkCode; MessageBox.Show(key.ToString());}
return?CallNextHookEx(handle,?nCode,?wParam,?lParam);
}
private?void?Form1_Load(object?sender,?EventArgs?e)
{
//創建鉤子(這個函數的參數妳可以百度找找,C#鉤子研究過但沒成功)
SetWindowsHookEx(params);
}
}