程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 用C#打造"QQ對戰平台擠房器"

用C#打造"QQ對戰平台擠房器"

編輯:C#入門知識

一、什麼是“QQ對戰平台擠房器”?

喜歡在“QQ對戰平台”或“浩方對戰平台”玩游戲的人都知道。平常平台上的房間基本很多都是人滿的,如果想找個房間,那可是要費好長的時間來“擠”才能進去,如果是節假日或晚上,那更要花費更多的時間在“擠”房上了,如下圖:

qq-fr-tr-1

而對於“QQ對戰平台”,如果房間已滿擠不進去,卻變態的還會彈出兩次提示!平時,就只有拼命的按“回車鍵”或“空格鍵”關閉這兩個討厭的彈出窗口,然後再用鼠標點房間,如果房間還是進不去,就只能再按上面來一次循環……一次、兩次不是問題;五次、十次也許還不是問題;但如果十幾次或上百次還是擠不進去,還手按那就有問題了!當然,如果你喜歡手虐那就另外說了-_-#

我不喜歡手虐,所以當有次碰到N次還是擠不進去時,我就在想,為什麼不寫個工具來代替我的手,用工具自動去幫我“擠”房間,幫我點那兩個討厭的提示窗口呢?於是這篇文章中的“QQ對戰平台擠房器”就這樣誕生了(這可解放多少人的雙手啊,大家鼓掌……)

二、“擠房”要怎樣“擠”?

上面說了,“擠房器”就是幫我們自動“擠”房,但是它要怎麼幫我們“擠”呢?它畢竟是機器,而不是人,它不會自動一看到房間就幫我們“擠”,除非我們給它定制了一套規則(也可以叫命令)。機器就是機器,有規則它才會去做事,如果沒規則也會做事,那它就是“人”(智能機器人?)了。

這規則要怎樣定制?讓我們先來看看我們平時進入房間的流程,如下圖:

qq-fr-tr-2

好了,根據上面的流程,我們要給“擠房器”定制的規則就是分別以下幾條:

1)、點擊房間。

2)、判斷是否已進入房間,如果沒有進入房間,則負責將顯示房間滿的兩個討厭的提示窗口關閉掉,並重新回到第1步。

3)、已進入房間,則停止“擠”房動作。

三、自動“擠房”的實現。

這裡的實現,就是用代碼去實現上面定制的三個規則。

1、點擊房間

在這裡我們簡單點,只是模擬鼠標去點擊鼠標當前所在的房間。說到這裡,也許做過WINDOWS應用程序開發的朋友已想到了用哪幾個API函數去模擬,對!就是以下幾個API的結合一起使用,就能實現鼠標的模擬點擊了。

1)、GetCursorPos : 獲取鼠標的當前所在位置。

定義原型如下:

[DllImport("user32.dll")]
internal static extern bool GetCursorPos(out Point lpPoint);

此函數返回當前鼠標所在的坐標位置。

2)、mouse_event : 鼠標事件的模擬

定義原型如下:

[DllImport("user32.dll", EntryPoint = "mouse_event")]
public static extern void mouse_event(
    int dwFlags,
    int dx,
    int dy,
    int dwData,
    int dwExtraInfo
);

此函數通過不同的dwFlags參數定義,可以模擬不同的鼠標事件,如鼠標左鍵的按下、彈起事件等。

結合以上兩個API函數,我們就能實現自動點擊鼠標所在的房間"的效果了,類似如下代碼:

Point point;

if(Win32API.GetCursorPos(out point)){

     //MouseAPI是對mouse_event API函數的一個簡單封裝。

     MouseAPI.SendMouseEvent(MouseAPI.MouseEvents.LeftButtonDown | MouseAPI.MouseEvents.LeftButtonUp, point, true);

}

但是上面的代碼是非常“機械”的,也即是不管當前鼠標所在的窗口是不是在房間上,它都會自動“點擊”一次!這樣可不人性化,所以我們再改進一下,點擊時先判斷當前鼠標停留的是不是在對戰平台的房間上,但可惜的QQ對戰平台的房間不是標准WINDOWS控件,所以無法獲取到房間的數據,最後只好簡單點判斷鼠標停留的窗口是不是QQ對戰平台的大廳,因為大廳是可獲取到的WINDOWS窗口控件,如下圖是用Spy++獲取到的大廳數據:

qq-fr-tr-3

也就是我們判斷鼠標停留的窗口的類型是不是屬於“Afx:400000:3”即可,如果是則表明鼠標是停留在QQ對戰平台的游戲大廳中的,就可以點擊房間了(注意:這裡停留的位置不一定是房間上,但這不影響使用,所以我就沒加以處理了)

這裡需要使用的API有:

3)、WindowFromPoint : 獲取某個坐標位置所在的窗口

定義原型如下:

[DllImport("user32.dll")]
internal static extern IntPtr WindowFromPoint(Point Point);

4)、GetClassName : 獲取某個窗口的類型名稱

定義原形如下:

[DllImport("user32.dll",  CharSet = CharSet.Unicode, SetLastError = true)]
internal static extern int GetClassName(IntPtr hWnd, StringBuilder buf, int nMaxCount);

加入上面的條件判斷,上面的代碼改進後如下:

if (Win32API.GetCursorPos(out point))
{
    hwnd = Win32API.WindowFromPoint(point);
    if (hwnd != IntPtr.Zero)
    {
        string className = Win32API.GetWindowClassName(hwnd);
        if (className.Equals("Afx:400000:3"))
        {
            MouseAPI.SendMouseEvent(MouseAPI.MouseEvents.LeftButtonDown | MouseAPI.MouseEvents.LeftButtonUp, point, true);
        }
    }
}
這樣“點擊房間”這步就可以算完美了,當鼠標不在房間(正確的說不在游戲大廳)上停留時,鼠標也不會亂點,這就方便在“擠房間”時隨時可以切換窗口了。

2、判斷是否已進入房間,如果沒有進入房間,則負責將顯示房間滿的兩個討厭的提示窗口關閉掉。

 1)判斷是否已進入房間: 和上面那步判斷鼠標是否停

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