VC++編程隱藏計算機中的鼠標(biāo)

字號:

一、實現(xiàn)方法
    Windows提供了一個API函數(shù)mouse_event,可以模擬一次鼠標(biāo)事件,比如左鍵單擊、雙擊和右鍵單擊等。在程序中使用此函數(shù)將產(chǎn)生一個十分有趣的效果,所模擬的鼠標(biāo)事件將屏蔽真正的鼠標(biāo)事件,我們的實例也就是利用該函數(shù)的這一特性來實現(xiàn)隱藏程序中的鼠標(biāo)。Mouse_event函數(shù)原型如下:
    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
    );
    第一個參數(shù)為代表所要模擬的鼠標(biāo)消息,為MOUSEEVENTF_LEFTDOWN時表示左鍵按下,為MOUSEEVENTF_LEFTUP表示左鍵松開。一般情況下,dwFlags取值如下:
    MOUSEEVENTF_MOVE 移動鼠標(biāo)
    MOUSEEVENTF_LEFTDOWN 模擬鼠標(biāo)左鍵按下
    MOUSEEVENTF_LEFTUP 模擬鼠標(biāo)左鍵抬起
    MOUSEEVENTF_RIGHTDOWN 模擬鼠標(biāo)右鍵按下
    MOUSEEVENTF_RIGHTUP 模擬鼠標(biāo)右鍵抬起
    MOUSEEVENTF_MIDDLEDOWN 模擬鼠標(biāo)中鍵按下
    MOUSEEVENTF_MIDDLEUP 模擬鼠標(biāo)中鍵抬起
    MOUSEEVENTF_ABSOLUTE 標(biāo)示是否采用絕對坐標(biāo)
    第二三個參數(shù)分別表示鼠標(biāo)的位置坐標(biāo)x,y,根據(jù)MOUSEEVENTF_ABSOLUTE標(biāo)志,指定x,y方向的絕對位置或相對位置。第四五個參數(shù)并不重要,一般也可設(shè)為0,0。
    下面是關(guān)于mouse_event的示例代碼,用兩個mouse_event (一次放下,一次松開)實現(xiàn)了鼠標(biāo)的單擊模擬:
    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);
    為了持續(xù)屏蔽系統(tǒng)的鼠標(biāo),需要啟動一個輔助線程來模擬鼠標(biāo)的動作,具體實現(xiàn)請參見代碼部分。
    二、編程步驟
    1、啟動Visual C++6.0,建立一個單文檔的應(yīng)用程序,將程序命名為"mouse";
    2、為了隱藏主窗口,將程序中的CmainFrame類中的OnCreate()函數(shù)刪除,并在CWinApp類里調(diào)用m_pMainWnd->ShowWindow(SW_HIDE);
    3、在CmainFrame類中定義全局變量POINT mp,cursorNew;
    4、添加代碼,編譯運行程序。
    三、程序代碼
    /////////////////////////////////////線程函數(shù);
    CMainFrame::CMainFrame()
    {
    HWND hWnd=::GetParent(NULL);
    GetCursorPos(mp);
    AfxBeginThread(FMouse,hWnd,0); //啟動模擬鼠標(biāo)行為的線程;
    }
    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();//得到系統(tǒng)中最前端窗口的句柄;
    GetWindowRect(hWnd,rt);
    GetWindowText(hWnd,tmp,20);
    GetWindowPlacement(hWnd,wp);//得到當(dāng)前窗口的位置;
    GetCursorPos(&cursorNew);//得到當(dāng)前鼠標(biāo)的位置;
    while(1){
    ::mouse_event(MOUSEEVENTF_MOVE,cursorNew.x,cursorNew.y,0,0);
    //模擬鼠標(biāo)的移動;
    }
    }
    }
    return 0;//結(jié)束線程;
    }
    四、小結(jié)
    上述程序介紹了使用Windows的API函數(shù)mouse_event()來模擬鼠標(biāo)的動作,從而隱藏機器中的鼠標(biāo)。于之相對應(yīng),Windows還提供了一個模擬鍵盤API函數(shù)Keybd_event(),使用該函數(shù)可以相應(yīng)的屏蔽鍵盤的動作。Keybd_event()函數(shù)能觸發(fā)一個按鍵事件,也就是說回產(chǎn)生一個WM_KEYDOWN或WM_KEYUP消息。該函數(shù)原型如下:  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()共有四個參數(shù),第一個為按鍵的虛擬鍵值,如回車鍵為vk_return, tab鍵為vk_tab。第二個參數(shù)為掃描碼,一般不用設(shè)置,用0代替就行第三個參數(shù)為選項標(biāo)志,如果為keydown則置0即可,如果為keyup則設(shè)成"KEYEVENTF_KEYUP",第四個參數(shù)一般也是置0即可?!疉’的虛擬鍵值為65,所以可以用如下代碼實現(xiàn)模擬按下’A’鍵,   keybd_event(65,0,0,0);
    keybd_event(65,0,KEYEVENTF_KEYUP,0);