首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 實作滑鼠鍵盤全域攔截與封鎖(二):Hook 類別完整實作

     編輯:關於C語言

核心類別 `Hocy_Hook`

封裝 Windows 全域鉤子(`WH_MOUSE_LL`、`WH_KEYBOARD_LL`),支援監控模式(記錄事件)與封鎖模式(攔截不傳遞)。

關鍵結構與常數

  • `MouseHookStruct`、`KeyboardHookStruct`:`Marshal.PtrToStructure` 解碼 `lParam`。
  • `WH_Codes.WH_MOUSE_LL` / `WH_KEYBOARD_LL`:低層級全域鉤子(不需 DLL 注入)。
  • 委派快取:`HookProc m_MouseHookProcedure`、`m_KeyboardHookProcedure` **必須保持參考**,否則 GC 回收導致 `CallbackOnCollectedDelegate` MDA 錯誤。

安裝鉤子 `InstallHook(flags)`


public bool InstallHook(string flags)
{
    this.flags = flags; // "0"=正常, "1"=監控, "2"=封鎖
    IntPtr hInstance = Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]);
    // 注意:hInstance 必須為 0x400000 (4194304) 才能成功安裝全域鉤子
    if (m_pMouseHook == IntPtr.Zero)
    {
        m_MouseHookProcedure = MouseHookProc;
        m_pMouseHook = Win32API.SetWindowsHookEx(WH_Codes.WH_MOUSE_LL, m_MouseHookProcedure, hInstance, 0);
        if (m_pMouseHook == IntPtr.Zero) { UnInstallHook(); return false; }
    }
    if (m_pKeyboardHook == IntPtr.Zero)
    {
        m_KeyboardHookProcedure = KeyboardHookProc;
        m_pKeyboardHook = Win32API.SetWindowsHookEx(WH_Codes.WH_KEYBOARD_LL, m_KeyboardHookProcedure, hInstance, 0);
        if (m_pKeyboardHook == IntPtr.Zero) { UnInstallHook(); return false; }
    }
    return true;
}

鍵盤鉤子處理 `KeyboardHookProc`

  • `flags=="2"`:直接回傳 `1` 封鎖所有按鍵。
  • `flags=="1"`:監控模式,引發 `OnKeyDown`/`OnKeyPress`/`OnKeyUp` 事件。
  • `ToAscii` + 鍵盤狀態陣列轉換虛擬鍵碼為字符,處理 Shift/CapsLock 大小寫邏輯。
  • 事件參數 `Handled=true` 可攔截該按鍵(回傳 `1`)。

滑鼠鉤子處理 `MouseHookProc`

  • 解碼 `MouseHookStruct` 取得座標、滾輪增量(`MouseData >> 16`)。
  • 識別左/右鍵按下/雙擊,引發 `OnMouseActivity` 事件。
  • 呼叫 `CallNextHookEx` 傳遞給下一個鉤子。

卸載鉤子 `UnInstallHook`


public bool UnInstallHook()
{
    bool ok = true;
    if (m_pMouseHook != IntPtr.Zero) ok &= Win32API.UnhookWindowsHookEx(m_pMouseHook);
    if (m_pKeyboardHook != IntPtr.Zero) ok &= Win32API.UnhookWindowsHookEx(m_pKeyboardHook);
    m_pMouseHook = m_pKeyboardHook = IntPtr.Zero;
    return ok;
}

事件定義


public event MouseEventHandler OnMouseActivity;
public event MouseUpdateEventHandler OnMouseUpdate;
public event KeyEventHandler OnKeyDown;
public event KeyPressEventHandler OnKeyPress;
public event KeyEventHandler OnKeyUp;

注意事項

  • 全域鉤子影響系統效能,僅在必要時安裝,盡快卸載。
  • 管理員權限程式可攔截 UAC 提示等安全桌面輸入(需測試)。
  • .NET Core / 5+ 需 `System.Windows.Forms` 相容包或改用 `GlobalLowLevelHooks` 等現代庫。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved