程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> VC++編程隱藏計算機中的鼠標

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

編輯:關於VC++

在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);

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved