hHook = SetWindowsHookEx(
WH_JOURNALRECORD,
(HOOKPROC)JournalRecordProc, // 錯誤:非靜態成員函數無法轉換
AfxGetApp()->m_hInstance,
0);
JournalRecordProc 是類的非靜態成員函數,隱含 this 指針,函數指針類型與 HOOKPROC (全局函數指針) 不兼容。
// .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 控件,需發送自定義消息到主線程處理。EVENTMSG 包含時間、消息、參數,回放時用 WH_JOURNALPLAYBACK。