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

MFC 實作隱藏滑鼠游標並攔截點擊事件的技術探討

     編輯:關於VC++

前言與安全警示

⚠ 警告: 本文技術具有一定風險,僅供技術研究與防禦理解使用。執行後可能導致滑鼠無法正常控制,請確保知道如何註銷或重啟系統恢復控制權。請勿用於惡意用途。

本文展示如何在 MFC 單文檔應用程式中,隱藏主視窗並建立背景執行緒持續移動滑鼠游標至當前前景視窗位置,實際上形成「滑鼠被鎖定」效果。透過此範例可理解 Windows 訊息迴圈、執行緒同步與滑鼠事件攔截的底層機制。

核心實作步驟

1. 建立單文檔 MFC 專案並隱藏主視窗

  • 使用 AppWizard 建立 SDI 專案
  • 刪除 CMainFrame::OnCreate,避免視窗顯示
  • 在 CWinApp 派生類中修改 m_pMainWnd 指向並呼叫 ShowWindow(SW_HIDE)

2. 主框架建構函數啟動監控執行緒

CMainFrame::CMainFrame() {
    HWND hWnd = ::GetParent(NULL);
    GetCursorPos(&mp);
    AfxBeginThread(FMouse, hWnd, 0);
}

3. 執行緒函數 FMouse:核心邏輯

UINT FMouse(LPVOID param) {
    int flag = 0;
    WINDOWPLACEMENT wp;
    wp.length = sizeof(WINDOWPLACEMENT);
    HWND hWnd;
    char tmp[20];
    RECT rt;
    hWnd = GetDesktopWindow();
    GetWindowPlacement(hWnd, &wp);
    GetWindowRect(hWnd, &rt);
    GetWindowText(hWnd, tmp, 20);
    HDC dc = GetDC((HWND)param);
    int iResult;
    iResult = AfxMessageBox("確實要隱藏嗎?", MB_OKCANCEL);
    if (iResult == IDOK) {
        while (1) {
            hWnd = GetForegroundWindow();
            GetWindowRect(hWnd, &rt);
            GetWindowText(hWnd, tmp, 20);
            GetWindowPlacement(hWnd, &wp);
            GetCursorPos(&cursorNew);
            while (1) {
                ::mouse_event(MOUSEEVENTF_MOVE, cursorNew.x, cursorNew.y, 0, 0);
            }
        }
    }
    return 0;
}

技術細節解析

API/技術用途
AfxBeginThread建立背景工作者執行緒,不阻塞主 UI 執行緒
GetForegroundWindow取得當前活躍視窗句柄
GetCursorPos取得當前滑鼠游標螢幕座標
mouse_event(MOUSEEVENTF_MOVE, ...)注入滑鼠移動事件,強制將游標移至指定座標
雙層 while(1) 迴圈外層持續更新目標視窗資訊,內層持續注入移動事件形成「鎖定」

防禦與檢測視角

  1. 行為特徵:滑鼠游標持續被強制移動至特定座標,使用者無法正常操作。
  2. 檢測方式:監控 mouse_event 高頻呼叫、非預期執行緒建立、主視窗隱藏但進程仍在運行。
  3. 緩解措施:Ctrl+Alt+Del 開啟工作管理員終止進程,或註銷/重啟系統。

總結

此範例展示了 Windows 底層輸入注入機制的強大與危險性。理解此原理有助於開發反惡意軟體工具、自動化測試框架或無障礙輔助技術。實際應用中,務必遵循最小權限原則,提供明確的使用者控制與退出機制。

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