熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

深入探討.NET中的鉤子技術[2]

2022-06-13   來源: .NET編程 

  三使用代碼

  在我們深入開發這個庫之前讓我們快速看一下我們的目標在本文中我們將開發一個類庫它安裝全局系統鉤子並且暴露這些由鉤子處理的事件作為我們的鉤子類的一個NET事件為了說明這個系統鉤子類的用法我們將在一個用C#編寫的Windows表單應用程序中創建一個鼠標事件鉤子和一個鍵盤事件鉤子

  這些類庫能用於創建任何類型的系統鉤子其中有兩個預編譯的鉤子MouseHook和KeyboardHook我們也已經包含了這些類的特定版本分別稱為MouseHookExt和KeyboardHookExt根據這些類所設置的模型你能容易構建系統鉤子針對Win API中任何種鉤子事件類型中的任何一種另外這個完整的類庫中還有一個編譯的HTML幫助文件它把這些類歸檔化請確信你看了這個幫助文件如果你決定在你的應用程序中使用這個庫的話

  MouseHook類的用法和生命周期相當簡單首先我們創建MouseHook類的一個實例

mouseHook = new MouseHook();//mouseHook是一個成員變量

  接下來我們把MouseEvent事件綁定到一個類層次的方法上

mouseHookMouseEvent+=new MouseHookMouseEventHandler(mouseHook_MouseEvent);

//

private void mouseHook_MouseEvent(MouseEvents mEvent int x int y){

 string msg =stringFormat(鼠標事件:{}:({}{})mEventToString()xy);

 AddText(msg);//增加消息到文本框

}

  為開始收到鼠標事件簡單地安裝下面的鉤子即可

mouseHookInstallHook();

  為停止接收事件只需簡單地卸載這個鉤子

mouseHookUninstallHook();

  你也可以調用Dispose來卸載這個鉤子

  在你的應用程序退出時卸載這個鉤子是很重要的讓系統鉤子一直安裝著將減慢系統中的所有的應用程序的消息處理它甚至能夠使一個或多個進程變得很不穩定因此請確保在你使用完鉤子時一定要移去你的系統鉤子我們確定在我們的示例應用程序會移去該系統鉤子通過在Form的Dispose方法中添加一個Dispose調用

protected override void Dispose(bool disposing) {

 if (disposing) {

if (mouseHook != null) {

 mouseHookDispose();

 mouseHook = null;

}

//

 }

}

  使用該類庫的情況就是如此該類庫中有兩個系統鉤子類並且相當容易擴充

  四構建庫

  這個庫共有兩個主要組件第一部分是一個C#類庫你可以直接使用於你的應用程序中該類庫反過來在內部使用一個非托管的C++ DLL來直接管理系統鉤子我們將首先討論開發該C++部分接下來我們將討論怎麼在C#中使用這個庫來構建一個通用的鉤子類就象我們討論C++/C#交互一樣我們將特別注意C++方法和數據類型是怎樣映射到NET方法和數據類型的

  你可能想知道為什麼我們需要兩個庫特別是一個非托管的C++ DLL你還可能注意到在本文的背景一節中提到的兩篇參考文章其中並沒有使用任何非托管的代碼為此我的回答是對!這正是我寫這篇文章的原因當你思考系統鉤子是怎樣實際地實現它們的功能時我們需要非托管的代碼是十分重要的為了使一個全局的系統鉤子能夠工作Windows把你的DLL插入到每個正在運行的進程的進程空間中既然大多數進程不是NET進程所以它們不能直接執行NET裝配集我們需要一種非托管的代碼代理Windows可以把它插入到所有將要被鉤住的進程中

  首先是提供一種機制來把一個NET代理傳遞到我們的C++庫這樣我們用C++語言定義下列函數(SetUserHookCallback)和函數指針(HookProc)

int SetUserHookCallback(HookProc userProc UINT hookID)

typedef void (CALLBACK *HookProc)(int code WPARAM w LPARAM l)

  SetUserHookCallback的第二個參數是鉤子類型這個函數指針將使用它現在我們必須用C#來定義相應的方法和代理以使用這段代碼下面是我們怎樣把它映射到C#

private static extern SetCallBackResults

SetUserHookCallback(HookProcessedHandler hookCallback HookTypes hookType)

protected delegate void HookProcessedHandler(int code UIntPtr wparam IntPtr lparam)

public enum HookTypes {

 JournalRecord =

 JournalPlayback =

 //

 KeyboardLL =

 MouseLL =

};

[]  []  []  []  []  


From:http://tw.wingwit.com/Article/program/net/201311/15484.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.