在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); |
爲了持續屏蔽系統的鼠標,需要啓動一個輔助線程來模擬鼠標的動作,具體實現請參見代碼部分。
二、編程步驟
1、啓動Visual C++6.0,建立一個單文檔的應用程序,將程序命名爲"mouse";
2、爲了隱藏主窗口,將程序中的CmainFrame類中的OnCreate()函數刪除,並在CWinApp類裏調用m_pMainWnd->ShowWindow(SW_HIDE);
3、在CmainFrame類中定義全局變量POINT mp,cursorNew;
4、添加代碼,編譯運行程序。
三、程序代碼
/////////////////////////////////////線程函數; 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消息。該函數原型如下:
VOID keybd_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); |
聞香止步 收集於:http://www.pcdog.com/edu/vc/2005/12/n057200.html
淘寶店 擺件 飾品 *木雕系列*:海南黃花梨、越南黃花梨、草花梨、小葉紫檀、黑檀、綠檀木、黃楊木、桃木髮簪 木梳 樟木壁掛 佛珠 車飾 擺件
http://shop36570193.taobao.com
朋友,有空來看看,喜歡的朋友請收藏