在Windows大行其道的今天,windows界面程序受到廣大用戶的歡迎。對這些程序的操作不外乎兩種,鍵盤輸入控制和鼠標輸入控制。那麼我們能否通過編制程序來控制系統的鼠標,例如隱藏計算機中的鼠標呢?這個問題的答案是肯定的。這裡主要是通過一個Windows API函數來實現的。下面以一個Visual C++的實例來介紹如何實現這個功能。需要讀者朋友們注意的是本代碼具有一定的危險性,程序運行後你將無法用鼠標控制您的計算機,這時候需要對計算機的當前用戶名進行注銷或重新啟動計算機。
一、實現方法
Windows提供了一個API函數mouse_event,可以模擬一次鼠標事件,比如左鍵單擊、雙擊和右鍵單擊等。在程序中使用此函數將產生一個十分有趣的效果,所模擬的鼠標事件將屏蔽真正的鼠標事件,我們的實例也就是利用該函數的這一特性來實現隱藏程序中的鼠標。Mouse_event函數原型如下:
VOID mouse_event(
DWord dwFlags, // flags specifying various motion/click variants
DWORD dx, // horizontal mouse position or position change
DWORD dy, // vertical mouse position or position change
DWORD dwData, // amount of wheel movement
DWORD dwExtraInfo
// 32 bits of application-defined information
);
第一個參數為代表所要模擬的鼠標消息,為MOUSEEVENTF_LEFTDOWN時表示左鍵按下,為MOUSEEVENTF_LEFTUP表示左鍵松開。一般情況下,dwFlags取值如下:
MOUSEEVENTF_MOVE 移動鼠標
MOUSEEVENTF_LEFTDOWN 模擬鼠標左鍵按下
MOUSEEVENTF_LEFTUP 模擬鼠標左鍵抬起
MOUSEEVENTF_RIGHTDOWN 模擬鼠標右鍵按下
MOUSEEVENTF_RIGHTUP 模擬鼠標右鍵抬起
MOUSEEVENTF_MIDDLEDOWN 模擬鼠標中鍵按下
MOUSEEVENTF_MIDDLEUP 模擬鼠標中鍵抬起
MOUSEEVENTF_ABSOLUTE 標示是否采用絕對坐標
第二三個參數分別表示鼠標的位置坐標x,y,根據MOUSEEVENTF_ABSOLUTE標志,指定x,y方向的絕對位置或相對位置。第四五個參數並不重要,一般也可設為0,0。
下面是關於mouse_event的示例代碼,用兩個mouse_event (一次放下,一次松開)實現了鼠標的單擊模擬:
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);
為了持續屏蔽系統的鼠標,需要啟動一個輔助線程來模擬鼠標的動作,具體實現請參見代碼部分。
/////////////////////////////////////線程函數;
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;
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;//結束線程;
}
四、小結
上述程序介紹了使用Windows的API函數mouse_event()來模擬鼠標的動作,從而隱藏機器中的鼠標。於之相對應,Windows還提供了一個模擬鍵盤API函數Keybd_event(),使用該函數可以相應的屏蔽鍵盤的動作。Keybd_event()函數能觸發一個按鍵事件,也就是說回產生一個WM_KEYDOWN或WM_KEYUP消息。該函數原型如下:
VOIDkeybd_event(
BYTE bVk, // virtual-key code
BYTE bScan, // hardware scan code
DWORD dwFlags, // flags specifying various function options
DWORD dwExtraInfo // additional data associated with keystroke
);
從上述原型可以看出,Keybd_event()共有四個參數,第一個為按鍵的虛擬鍵值,如回車鍵為vk_return, tab鍵為vk_tab。第二個參數為掃描碼,一般不用設置,用0代替就行第三個參數為選項標志,如果為keydown則置0即可,如果為keyup則設成"KEYEVENTF_KEYUP",第四個參數一般也是置0即可。'A'的虛擬鍵值為65,所以可以用如下代碼實現模擬按下'A'鍵,
keybd_event(65,0,0,0);
keybd_event(65,0,KEYEVENTF_KEYUP,0);