天天看點

C# 系統應用之滑鼠模拟技術及自動操作滑鼠

遊戲程式的操作不外乎兩種——鍵盤輸入控制和滑鼠輸入控制,幾乎所有遊戲中都使用滑鼠來改變角色的位置和方向,本文主要是講述如何使用C#調用Windows API函數實作滑鼠模拟操作的功能.首先通過結合FindWindow和FindWindowEx尋找到窗體的按鈕,在通過SetCursorPos或mouse_event函數操作滑鼠,同時涉及到通過spy++工具擷取窗體消息的資訊.

.NET沒有提供改變滑鼠指針位置、模拟單機操作的函數,但是可以通過調用Windows API函數實作.

[DllImport("user32.dll")]

static extern bool SetCursorPos(int X,int Y);

該函數用于設定滑鼠的位置,其中X和Y是相對于螢幕左上角的絕對位置.

static extern void mouse_event(MouseEventFlag flags,int dx,int dy,uint data,UIntPtr extraInfo);

該函數不僅可以設定滑鼠指針絕對位置,而且可以以相對坐标來設定位置.

其中flags标志位集,指定點選按鈕和滑鼠動作的多種情況.dx指滑鼠沿x軸絕對位置或上次滑鼠事件位置産生以來移動的數量.dy指沿y軸的絕對位置或從上次滑鼠事件以來移動的數量.data如果flags為MOUSE_WHEEL則該值指滑鼠輪移動的數量(否則為0),正值向前轉動.extraInfo指定與滑鼠事件相關的附加32位值.

static extern IntPtr FindWindow(string strClass, string strWindow);

該函數根據類名和視窗名來得到視窗句柄,但是這個函數不能查找子視窗,也不區分大小寫.如果要從一個視窗的子視窗查找需要使用FIndWindowEX函數.

static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter,

                string strClass, string strWindow);

該函數擷取一個視窗的句柄,該視窗的類名和視窗名與給定的字元串相比對,該函數查找子視窗時從排在給定的子視窗後面的下一個子視窗開始.其中參數

hwnParent為要查找子視窗的父視窗句柄,若該值為NULL則函數以桌面視窗為父視窗,查找桌面視窗的所有子視窗.

hwndChildAfter子視窗句柄,查找從在Z序中的下一個子視窗開始,子視窗必須為hwnParent直接子視窗而非後代視窗,若hwnChildAfter為NULL,查找從父視窗的第一個子視窗開始.

strClass指向一個指定類名的空結束字元串或一個辨別類名字元串的成員的指針.

strWindow指向一個指定視窗名(視窗标題)的空結束字元串.若為NULL則所有窗體全比對.

傳回值:如果函數成功,傳回值為具有指定類名和視窗名的視窗句柄,如果函數失敗,傳回值為NULL.

首先建立一個C#工程,設計的窗體如下圖所示,同時添加Timer時間器控件:

C# 系統應用之滑鼠模拟技術及自動操作滑鼠

然後添加的如下代碼,即可實作滑鼠模拟技術及自動操作滑鼠:

同時自定義一個對話框,增加一個button按鈕,其運作結果如下圖所示:

C# 系統應用之滑鼠模拟技術及自動操作滑鼠

可以看到當運作程式勾選"檢視滑鼠運作的軌迹"并點選"開始"按鈕後,會通過FindWindow和FindWindowEx函數查找窗體"Form1"的"button1"按鈕,并通過mouse_event移動滑鼠和點選滑鼠.其中函數原型為:

但是怎樣找到窗體類名和按鈕的類名呢?由于初學,很多窗體我都沒有實作如QQ,它需要用到一個叫spy++的工具.

如果修改代碼為:

可以擷取電腦底部工作列的托盤通知句柄,其中通過Spy++工具(VS中"工具"中自帶)查找如下圖所示:

C# 系統應用之滑鼠模拟技術及自動操作滑鼠

同樣,我通過spy++工具擷取txt句柄,首先打開spy++工具,同時點選"查找視窗"按鈕(望遠鏡),再點選"查找程式工具"中按鈕拖拽至要檢視的窗體中,點選"确定"按鈕.

C# 系統應用之滑鼠模拟技術及自動操作滑鼠

這樣就會顯示這個txt的資訊,同時可以右擊"屬性"顯示窗體的類名、窗體題目、句柄等資訊.

C# 系統應用之滑鼠模拟技術及自動操作滑鼠

最後通過下面代碼可以擷取hello.txt的句柄:

再通過mouse_event操作滑鼠,同時可以通過SendMessage将指定的消息發送到一個或多個視窗,PostMessage将一個消息寄送到一個線程的消息隊列後就立即傳回.實作消息傳遞等功能,學習ing~

該篇文章主要講述C#如何操作滑鼠的事件,在制作遊戲外挂或自動運作程式時非常實用,但遺憾的是在上面通過窗體名稱"Form1"擷取窗體時總是失敗,需要通過spy++擷取它的類名來實作.Why?同時如果想學習鍵盤模拟技術的可以研究SetWindowsHookEx(安裝鈎子)、CallNextHookEx(下一個鈎子)、UnhookWindowsHookEx(解除安裝鈎子)和滑鼠Hook實作很多技術.

希望文章對大家有所幫助,如果有錯誤或不足之處,請見諒~

(By:Eastmount 2014年10月13日 晚上8點

參考資料-線上筆記:

本文主要參考書籍《C#網絡變成進階篇之網頁遊戲輔助程式設計》張慧斌 王小峰著

3.FindWindowEx用法(By-coolszy)

<a target="_blank" href="http://blog.csdn.net/coolszy/article/details/5523784">http://blog.csdn.net/coolszy/article/details/5523784</a>

6.C#如何在外部程式的密碼框内自動輸入密碼

<a target="_blank" href="http://biancheng.dnbcw.info/c/117849.html">http://biancheng.dnbcw.info/c/117849.html</a>

繼續閱讀