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

C# 實現螢幕鍵盤 ScreenKeyboard(三)——鉤子卸載與資源釋放完整實現

     編輯:關於C語言

鉤子卸載核心代碼


public void Stop()
{
    this.Stop(true, true, true);
}

public void Stop(bool uninstallMouseHook, bool uninstallKeyboardHook, bool throwExceptions)
{
    // 卸載滑鼠鉤子
    if (hMouseHook != IntPtr.Zero && uninstallMouseHook)
    {
        bool retMouse = UnhookWindowsHookEx(hMouseHook);
        hMouseHook = IntPtr.Zero;
        
        if (!retMouse && throwExceptions)
        {
            int errorCode = Marshal.GetLastWin32Error();
            throw new Win32Exception(errorCode);
        }
    }

    // 卸載鍵盤鉤子
    if (hKeyboardHook != IntPtr.Zero && uninstallKeyboardHook)
    {
        bool retKeyboard = UnhookWindowsHookEx(hKeyboardHook);
        hKeyboardHook = IntPtr.Zero;
        
        if (!retKeyboard && throwExceptions)
        {
            int errorCode = Marshal.GetLastWin32Error();
            throw new Win32Exception(errorCode);
        }
    }
}

關鍵 API 與錯誤處理

  • UnhookWindowsHookEx:卸載鉤子,回傳 true 表示成功
  • Marshal.GetLastWin32Error:取得 Win32 錯誤碼
  • Win32Exception:封裝系統錯誤碼的 .NET 異常
  • IntPtr.Zero 重置:防止重複卸載或使用已釋放控制代碼
  • 參數化控制:可獨立控制滑鼠/鍵盤鉤子卸載,支援選擇性釋放

析構函數建議


~UserActivityHook()
{
    Stop(true, true, false); // 終結器不拋異常
}

資源管理原則

  1. 實作 IDisposable,提供 Dispose() 呼叫 Stop()
  2. 使用 using 區塊確保釋放
  3. 終結器作為安全網,但不拋異常
  4. 靜態變數持有鉤子控制代碼,避免 GC 過早回收委派
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved