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

C++ 痕跡保留:按鈕點擊時間、主機名 IP、滑鼠軌跡記錄到 TXT,超類化窗口類統一處理

     編輯:程式設計綜合問答

需求

  1. 所有按鈕點擊時間追加記錄到 `log.txt`,不可覆蓋。
  2. 程式啟動記錄本機主機名、IP 到 `info.txt`。
  3. 程式結束時記錄滑鼠移動軌跡到 `trace.txt`。

核心技術點

1. 按鈕點擊統一攔截:超類化 窗口類

不在每個按鈕處理器寫 log,而是**建立自訂窗口類繼承 `CButton`/`CWnd`,重寫 `WindowProc` 攔截 `WM_COMMAND` (BN_CLICKED) 統一記錄**。


// 超類化按鈕類
class CLogButton : public CButton {
    virtual LRESULT WindowProc(UINT msg, WPARAM wp, LPARAM lp) {
        if (msg == WM_COMMAND && HIWORD(wp) == BN_CLICKED) {
            LogButtonClick(GetDlgCtrlID(), GetWindowText());
        }
        return CButton::WindowProc(msg, wp, lp);
    }
    void LogButtonClick(UINT id, CString text) {
        CStdioFile f; f.Open(_T("log.txt"), CFile::modeCreate|CFile::modeNoTruncate|CFile::modeWrite|CFile::shareDenyNone);
        f.SeekToEnd();
        CString log; log.Format(_T("[%s] BTN_ID=%u TEXT=%s\r\n"), CTime::GetCurrentTime().Format(_T("%Y-%m-%d %H:%M:%S")), id, text);
        f.WriteString(log); f.Close();
    }
};

對話框資源中將按鈕類別名改為 `CLogButton` (或動態 `SubclassDlgItem`)。

2. 主機名/IP 記錄


void LogHostInfo() {
    char host[256]; gethostname(host, 256);
    hostent* he = gethostbyname(host);
    CString ip = (he && he->h_addr_list[0]) ? inet_ntoa(*(in_addr*)he->h_addr_list[0]) : _T("Unknown");
    CStdioFile f; f.Open(_T("info.txt"), CFile::modeCreate|CFile::modeNoTruncate|CFile::modeWrite);
    f.SeekToEnd();
    f.WriteString(CTime::GetCurrentTime().Format(_T("[%Y-%m-%d %H:%M:%S] Host=%s IP=%s\r\n")), host, ip);
    f.Close();
}

3. 滑鼠軌跡記錄:低頻採樣 + 結束時寫入

  • **全域鉤子 `SetWindowsHookEx(WH_MOUSE_LL, ...)`** 記錄全螢幕軌跡 (需管理員/高完整性)。
  • **視窗內 `WM_MOUSEMOVE`** 記錄客戶區相對座標 (輕量、無權限問題)。
  • **定時器/緩衝區**:滑鼠移動極頻繁,**每 50-100ms 採樣一次**或**只記錄方向改變點**,避免檔案爆炸。程式結束時 `OnClose`/`ExitInstance` 批次寫入 `trace.txt`。

總結

痕跡保留三件套:**超類化按鈕統一 Log 點擊**、**啟動記錄 Host/IP**、**低頻採樣滑鼠軌跡退出寫檔**。關鍵在於「統一攔截點避免重複代碼」與「控制採樣頻率防止 IO/空間爆炸」。

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