在 Windows 應用程式開發中,鍵盤與滑鼠是使用者互動的兩大核心輸入裝置。若能透過程式控制系統滑鼠行為,例如隱藏特定視窗(如計算機)的滑鼠游標,將極大擴展應用程式的控制能力。本文將介紹如何使用 Visual C++ 搭配 Windows API mouse_event 函式,達成「模擬滑鼠事件以屏蔽真實滑鼠輸入」的效果,並提供完整程式碼範例與執行風險說明。
Windows 提供的 mouse_event API 可模擬滑鼠移動、點擊、滾輪等動作。其關鍵特性在於:系統會優先處理模擬事件,導致真實滑鼠輸入被忽略。只要持續在背景執行緒發送模擬移動事件,即可達到「隱藏滑鼠」的視覺與功能效果。
VOID mouse_event(
DWORD dwFlags, // 模擬事件類型(移動、左鍵按下/放開、右鍵等)
DWORD dx, // X 座標或相對位移
DWORD dy, // Y 座標或相對位移
DWORD dwData, // 滾輪移動量
DWORD dwExtraInfo // 應用程式自訂資訊
);
常用 dwFlags 值:
MOUSEEVENTF_MOVE:移動滑鼠MOUSEEVENTF_LEFTDOWN / MOUSEEVENTF_LEFTUP:左鍵按下/放開MOUSEEVENTF_RIGHTDOWN / MOUSEEVENTF_RIGHTUP:右鍵按下/放開MOUSEEVENTF_ABSOLUTE:使用絕對座標POINT lpPoint;
GetCursorPos(&lpPoint);
SetCursorPos(lpPoint.x, lpPoint.y);
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
為了持續屏蔽系統滑鼠,需建立一個輔助執行緒,在無限迴圈中呼叫 mouse_event(MOUSEEVENTF_MOVE, ...)。以下為關鍵程式碼片段(節錄自主視窗框架建構函式):
CMainFrame::CMainFrame() {
HWND hWnd = ::GetParent(NULL);
GetCursorPos(mp);
AfxBeginThread(FMouse, hWnd, 0); // 啟動模擬滑鼠行為的執行緒
}
UINT FMouse(LPVOID param) {
WINDOWPLACEMENT wp;
wp.length = sizeof(WINDOWPLACEMENT);
HWND hWnd;
char tmp[20];
RECT rt;
int iResult = AfxMessageBox(_T("確定要隱藏嗎?"), 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;
}
⚠ 警告: 執行此程式後,整個系統的滑鼠將失去控制,唯一恢復方式是「註銷目前使用者」或「重新啟動電腦」。請務必在測試環境或虛擬機中執行,切勿在生產機器上直接執行。
Windows 同樣提供 keybd_event API 以模擬鍵盤事件,原理相同,可用於屏蔽鍵盤輸入。函式原型如下:
VOID keybd_event(
BYTE bVk, // 虛擬鍵碼(如 VK_RETURN, VK_TAB)
BYTE bScan, // 掃描碼,通常設 0
DWORD dwFlags, // 0 表示按下,KEYEVENTF_KEYUP 表示放開
DWORD dwExtraInfo // 保留,設 0
);
範例:模擬按下 'A' 鍵(虛擬鍵碼 65)
keybd_event(65, 0, 0, 0); // 按下
keybd_event(65, 0, KEYEVENTF_KEYUP, 0); // 放開
本文展示了利用 mouse_event 以軟體模擬硬體輸入,進而干擾/屏蔽真實裝置的技術。雖然在特定自動化測試、防輸入干擾場景有應用價值,但極具風險,嚴禁用於惡意用途。開發者應充分理解其系統級影響,並在受控環境下謹慎測試。