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

WinAPI 鉤子回調:JournalRecordProc 詳細解析

     編輯:Delphi

JournalRecordProc 回調函數

JournalRecordProc 配合 WH_JOURNALRECORD 鉤子類型,用於攔截並記錄系統範圍內的所有輸入事件(滑鼠移動、點擊、鍵盤按鍵等)。它是實現「巨集錄製器」的核心。

函數原型

function JournalRecordProc(
  nCode: Integer;    // 鉤子代碼
  wParam: WPARAM;    // 訊息 ID(如 WM_MOUSEMOVE, WM_KEYDOWN)
  lParam: LPARAM     // 指向 EVENTMSG 結構
): LRESULT; stdcall;

參數詳解

  • nCode:若小於 0 必須呼叫 CallNextHookEx;通常為 HC_ACTION (0),表示有事件發生需處理。
  • wParam:Windows 訊息常數(WM_*)。
  • lParam:指向 EVENTMSG 結構:
    type
      tagEVENTMSG = record
        message: UINT;    // 訊息 ID
        paramL: UINT;     // 低位參數
        paramH: UINT;     // 高位參數
        time: DWORD;      // 事件時間戳
        hwnd: HWND;       // 目標視窗句柄
      end;

運作機制

  1. 應用程式呼叫 SetWindowsHookEx(WH_JOURNALRECORD, @JournalRecordProc, hInstance, 0) 安裝系統級鉤子。
  2. 使用者進行任何輸入操作,系統將事件封裝為 EVENTMSG 並呼叫 JournalRecordProc。
  3. 回調函數將事件存入記憶體緩衝區或寫入檔案,然後返回 0 讓事件繼續傳遞。
  4. 錄製結束時呼叫 UnhookWindowsHookEx 卸載鉤子。

關鍵限制

  • 必須在 DLL 中實現:系統級 Journal 鉤子要求回調函數位於 DLL,EXE 直接安裝會失敗或導致系統死結。
  • 效能敏感:回調執行期間系統輸入處理被阻塞,務必極快返回,不可執行耗時操作(如檔案 I/O、資料庫存取),建議只做記憶體複製。
  • 權限提升:Vista+ 需管理員權限或 UIAccess 權限才能安裝全域 Journal 鉤子。

現代替代方案

考慮使用 Raw Input API、UI Automation 或 Windows Hooks (WH_KEYBOARD_LL / WH_MOUSE_LL) 實現低權限、高可靠性的輸入監聽與記錄。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved