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

Windows Hook 記錄回放:WH_JOURNALRECORD 回調函數靜態聲明修復

     編輯:程式設計綜合問答

錯誤代碼

hHook = SetWindowsHookEx(
    WH_JOURNALRECORD,
    (HOOKPROC)JournalRecordProc,  // 錯誤:非靜態成員函數無法轉換
    AfxGetApp()->m_hInstance,
    0);

原因

JournalRecordProc 是類的非靜態成員函數,隱含 this 指針,函數指針類型與 HOOKPROC (全局函數指針) 不兼容。

修復方案

方案一:聲明為 static (推薦)

// .h
class CMFCApplication2Dlg : public CDialogEx {
    static LRESULT CALLBACK JournalRecordProc(int code, WPARAM wParam, LPARAM lParam);
    // ...
};

// .cpp
LRESULT CALLBACK CMFCApplication2Dlg::JournalRecordProc(int code, WPARAM wParam, LPARAM lParam) {
    if (code < 0) return CallNextHookEx(hHook, code, wParam, lParam);
    // 處理 EVENTMSG*
    return 0;
}

方案二:全局函數 + 單例獲取實例

// 全局
CMFCApplication2Dlg* g_pMainDlg = nullptr;

LRESULT CALLBACK JournalRecordProc(int code, WPARAM wParam, LPARAM lParam) {
    if (g_pMainDlg) return g_pMainDlg->OnJournalRecord(code, wParam, lParam);
    return CallNextHookEx(hHook, code, wParam, lParam);
}

// 在 OnInitDialog 設置
g_pMainDlg = this;

注意事項

  • WH_JOURNALRECORD 是全局鉤子,回調在系統進程上下文執行,不能直接訪問 UI 控件,需發送自定義消息到主線程處理。
  • 64 位系統下鉤子 DLL 必須與目標進程位數一致(註冊 32/64 位兩個版本)。
  • 記錄的 EVENTMSG 包含時間、消息、參數,回放時用 WH_JOURNALPLAYBACK。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved