⚠ 警告: 本文技術具有一定風險,僅供技術研究與防禦理解使用。執行後可能導致滑鼠無法正常控制,請確保知道如何註銷或重啟系統恢復控制權。請勿用於惡意用途。
本文展示如何在 MFC 單文檔應用程式中,隱藏主視窗並建立背景執行緒持續移動滑鼠游標至當前前景視窗位置,實際上形成「滑鼠被鎖定」效果。透過此範例可理解 Windows 訊息迴圈、執行緒同步與滑鼠事件攔截的底層機制。
CMainFrame::OnCreate,避免視窗顯示CWinApp 派生類中修改 m_pMainWnd 指向並呼叫 ShowWindow(SW_HIDE)CMainFrame::CMainFrame() {
HWND hWnd = ::GetParent(NULL);
GetCursorPos(&mp);
AfxBeginThread(FMouse, hWnd, 0);
}
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) 迴圈 | 外層持續更新目標視窗資訊,內層持續注入移動事件形成「鎖定」 |
mouse_event 高頻呼叫、非預期執行緒建立、主視窗隱藏但進程仍在運行。此範例展示了 Windows 底層輸入注入機制的強大與危險性。理解此原理有助於開發反惡意軟體工具、自動化測試框架或無障礙輔助技術。實際應用中,務必遵循最小權限原則,提供明確的使用者控制與退出機制。