幾乎所有的游戲中都使用了鼠標來改變角色的位置和方向,玩家僅用一個小小的鼠
標,就可以使角色暢游天下。 那么,我們如何實現在沒有玩家的參與下角色也可以自動行走呢。其實實現這個並不
難,僅僅幾個Windows API函數就
可以搞定,讓我們先來認識認識這些API函數。
(1) 模擬鼠標動作API函數mouse_event,它可以實現模擬鼠標按下和放開等動作。
VOID mouse_event(
DWORD dwFlags, // 鼠標動作標識。
DWORD dx, // 鼠標水平方向位置。
DWORD dy, // 鼠標垂直方向位置。
DWORD dwData, // 鼠標輪子轉動的數量。
DWORD dwExtraInfo // 一個關聯鼠標動作輔加信息。
);
其中,dwFlags表示了各種各樣的鼠標動作和點擊活動,它的常用取值如下:
MOUSEEVENTF_MOVE 表示模擬鼠標移動事件。
MOUSEEVENTF_LEFTDOWN 表示模擬按下鼠標左鍵。
MOUSEEVENTF_LEFTUP 表示模擬放開鼠標左鍵。
MOUSEEVENTF_RIGHTDOWN 表示模擬按下鼠標右鍵。
MOUSEEVENTF_RIGHTUP 表示模擬放開鼠標右鍵。
MOUSEEVENTF_MIDDLEDOWN 表示模擬按下鼠標中鍵。
MOUSEEVENTF_MIDDLEUP 表示模擬放開鼠標中鍵。
(2)、設置和獲取當前鼠標位置的API函數。獲取當前鼠標位置使用GetCursorPos()
函數,設置當前鼠標位置使用
SetCursorPos()函數。
BOOL GetCursorPos(
LPPOINT lpPoint // 返回鼠標的當前位置。
);
BOOL SetCursorPos(
int X, // 鼠標的水平方向位置。
int Y //鼠標的垂直方向位置。
);
通常游戲角色的行走都是通過鼠標移動至目的地,然后按一下鼠標的按鈕就搞定
了。下面我們使用上面介紹的API
函數來模擬角色行走過程。
CPoint oldPoint,newPoint;
GetCursorPos(&oldPoint); //保存當前鼠標位置。
newPoint.x = oldPoint.x+40;
newPoint.y = oldPoint.y+10;
SetCursorPos(newPoint.x,newPoint.y); //設置目的地位置。
mouse_event(MOUSEEVENTF_RIGHTDOWN,0,0,0,0);//模擬按下鼠標右鍵。
mouse_event(MOUSEEVENTF_RIGHTUP,0,0,0,0);//模擬放開鼠標右鍵。
2. 鍵盤模擬技術
在很多游戲中,不僅提供了鼠標的操作,而且還提供了鍵盤的操作,在對攻擊對象
進行攻擊時還可以使用快捷鍵
。為了使這些攻擊過程能夠自動進行,外掛程序需要使用鍵盤模擬技術。像鼠標模擬技
術一樣,Windows API也提供了
一系列API函數來完成對鍵盤動作的模擬。
模擬鍵盤動作API函數keydb_event,它可以模擬對鍵盤上的某個或某些鍵進行按下
或放開的動作。
VOID keybd_event(
BYTE bVk, // 虛擬鍵值。
BYTE bScan, // 硬件掃描碼。
DWORD dwFlags, // 動作標識。
DWORD dwExtraInfo // 與鍵盤動作關聯的輔加信息。
);
其中,bVk表示虛擬鍵值,其實它是一個BYTE類型值的宏,其取值范圍為1-254。有
關虛擬鍵值表請在MSDN上使用
關鍵字“Virtual-Key Codes”查找相關資料。bScan表示當鍵盤上某鍵被按下和放開
時,鍵盤系統硬件產生的掃描碼
,我們可以MapVirtualKey()函數在虛擬鍵值與掃描碼之間進行轉換。dwFlags表示各種
各樣的鍵盤動作,它有兩種取
值:KEYEVENTF_EXTENDEDKEY和KEYEVENTF_KEYUP。
下面我們使用一段代碼實現在游戲中按下Shift+R快捷鍵對攻擊對象進行攻擊。
keybd_event(VK_CONTROL,MapVirtualKey(VK_CONTROL,0),0,0); //按下CTRL
鍵。
keybd_event(0x52,MapVirtualKey(0x52,0),0,0);//鍵下R鍵。
keybd_event(0x52,MapVirtualKey(0x52,0), KEYEVENTF_KEYUP,0);//放開R鍵。
keybd_event(VK_CONTROL,MapVirtualKey(VK_CONTROL,0),
KEYEVENTF_KEYUP,0);//放開CTRL鍵。