在C#中引用win32動態連接庫
Windows API
使用Windows API編程和C#編程的區別
- 靈活性和控制粒度
Windows API:可以攔截和處理系統級別的所有消息,包括鍵盤、鼠標、窗口消息等,提供了極高的控制粒度。
高級編程語言庫:通常只能處理特定類型的消息(只限于C#封裝好的方法),且需要通過重寫方法來實現,靈活性較差。 - 功能范圍
Windows API:可以發送任意消息到任意窗口,甚至是系統消息,功能非常廣泛。
高級編程語言庫:功能有限,通常只能發送和處理應用程序內的消息。 - 性能和效率
Windows API:直接調用系統底層函數,性能高效。
高級編程語言庫:通過封裝實現,可能有額外的性能開銷。 - 實現復雜度
Windows API:需要了解系統級編程,有一定的實現復雜度。
高級編程語言庫:實現簡單,易于使用 - 語言獨立性
Windows API 是操作系統級的接口,幾乎所有編程語言都可以調用:許多跨平臺 GUI 庫在 Windows 平臺上也是通過調用 Windows API 實現的。
鉤子
參考來源: 王旭(http://www.wxzzz.com)
概述
作用:
鉤子允許應用程序監視和干預系統和其他應用程序的行為,攔截系統或應用程序中的消息,以便在特定事件發生時執行自定義代碼。
種類:
常見的鉤子類型
- 鍵盤鉤子、
- 鼠標鉤子、
- 窗口消息鉤子、
- 系統消息鉤子等。
范圍:
鉤子可以是全局的(系統范圍內的鉤子,能夠監視和干預所有應用程序),也可以是局部的(只針對特定應用程序)。
應用場景
C#客戶端(winform,VB,WPF)的事件的觸發機制:通過設置勾子監聽系統或應用程序中的消息,再配合C#中的event事件實現
困擾我4年-_-
用到的win32API
//安裝鉤子
[DllImport("user32.dll")]
private static extern IntPtr SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hMod, uint dwThreadId);
//下一個鉤子
[DllImport("user32.dll")]
private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);
// 卸載鉤子
[DllImport("user32.dll")]
private static extern int UnhookWindowsHookEx(int idHook);
鼠標點擊事件的觸發原理
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
MouseHelper mouseHelper = new MouseHelper();
mouseHelper.MouseEvent += (() => { MessageBox.Show("HaHa"); });
mouseHelper.Listen();
}
}
public class MouseHelper
{
// WH_MOUSE_LL 是一種低級鼠標鉤子,允許對鼠標事件進行全局監視,無論事件發生在哪個窗口中。
// 用于攔截和監視鼠標事件,如鼠標移動、按鍵等。
private const int WH_MOUSE_LL = 14;
//全局事件
public event Action MouseEvent;
// 鉤子處理函數委托
private delegate IntPtr HookProc(int nCode, IntPtr wParam, IntPtr lParam);
/// <summary>
/// 此字段不客觀需要的,但我們需要保持一個供參考的將被傳遞給非托管代碼的委托。
/// 為了避免GC把它清理干凈。
/// </summary>
private static HookProc s_MouseDelegate;
// 從 user32.dll 導入 SetWindowsHookEx 函數
[DllImport("user32.dll")]
private static extern IntPtr SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hMod, uint dwThreadId);
// 從 user32.dll 導入 CallNextHookEx 函數
[DllImport("user32.dll")]
private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);
[DllImport("user32.dll")]
private static extern int UnhookWindowsHookEx(int idHook);
// 鉤子處理函數
private IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
{
if (nCode >= 0 && wParam == (IntPtr)0x0201) // WM_LBUTTONDOWN
{
//觸發點擊事件
MouseEvent?.Invoke();
// 在這里處理鼠標左鍵按下事件
Console.WriteLine("左鍵按下");
}
// 繼續傳遞消息
return CallNextHookEx(IntPtr.Zero, nCode, wParam, lParam);
}
public void Listen()
{
//為了避免GC把它清理干凈。
s_MouseDelegate = HookCallback;
//安裝鉤子
//要傳入靜態的s_MouseDelegate,避免GC把它清理掉
SetWindowsHookEx(WH_MOUSE_LL, s_MouseDelegate, IntPtr.Zero, 0);
}
}

浙公網安備 33010602011771號