Visual C++編程隱藏計算機中的鼠標

  在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

朋友,有空來看看,喜歡的朋友請收藏

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章