【GitHub】全民打棒球 懶人1:1

全民打棒球 小小工具

寫程式,真的要熱情去支持你!我不想我哪一天變成一句寫程式的活屍。

最近迷上全民打棒球手機版,喜歡上原因很間單,我算是半個球迷。(偶爾看看,重大賽事就瘋狂)

但是,令人失望的事情是,伺服器真的不太好,而且看到數字網友在再賣道具,大概就是外掛了。

我功力不夠強,封包就是看不懂,有強者可以領進門再拜託了!!

好吧!網路上有人教1:1對戰怎樣用按鍵精靈,但是,還要設定來設定去。

把心一橫,六日就來寫屬於自己的產品嚕!!

假設立場:伺服器一切穩當,只需要重覆的打。

目標:

  1. 可以設定間隔時間。
  2. 簡單,懶人
  3. 步驟再多就不好嚕!

好啦!需求定義清楚,客戶就是我自己,不會有澳客煩惱,出發!!

工作內容:

  1. 滑鼠移動到定點。
  2. 滑鼠模擬按下。
  3. 一定時間後,重覆1跟2。

技能需求:

  • WindForm(會寫,但不是主力)
  • Timer(稍稍知道概念)
  • 滑鼠模擬(完全不會)
  • 鍵盤監控(完全不會)

在只會1 跟2 的情況下,先搞定滑鼠模擬好了,這次做這個功能再次驗證,網路資源非常資多,但是,你撈不撈的到又是另外一回事。

1跟2在原有技術很快速達到了,這邊只記錄模擬滑鼠按下的程式碼:

程式碼是參考這一邊文章取得http://www.haolizi.net/example/view_611.html

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

[Flags]
enum MouseEventFlag : uint
{
	Move = 0x0001,
	LeftDown = 0x0002,
	LeftUp = 0x0004,
	RightDown = 0x0008,
	RightUp = 0x0010,
	MiddleDown = 0x0020,
	MiddleUp = 0x0040,
	XDown = 0x0080,
	XUp = 0x0100,
	Wheel = 0x0800,
	VirtualDesk = 0x4000,
	Absolute = 0x8000,
}

 //滑鼠移動到XY位置,用,分隔
private void cmdMouseMove(string str)
{
	string[] strs = str.Split(',');
	if (strs.Length == 2)
	{
		int x = int.Parse(strs[0]);
		int y = int.Parse(strs[1]);
		Cursor.Position = new Point(x, y);
	}
}
//滑鼠左鍵按下
private void cmdMouseClick()
{
	mouse_event(MouseEventFlag.LeftDown, 0, 0, 0, UIntPtr.Zero);
	mouse_event(MouseEventFlag.LeftUp, 0, 0, 0, UIntPtr.Zero);
}

Timer請看MSDN就好哩!http://msdn.microsoft.com/zh-tw/library/system.timers.timer.aspx

好啦!在這樣的前提底下我完成了第一個蠢版本。

第一個版本缺點:

  • X,Y還要靠結圖軟體之類的去抓,自己再填進去。
  • 我的應用程式要開在那裡,不能縮小跑去做其他事情。

所以拉,呼應寫程式是需要熱情的,所以往第二個版本修改。

座標這件事情,意外找到一個DLL完美處理。主要關鍵字:C# 全域監控

參考文章:http://mobile.dotblogs.com.tw/nobel12/archive/2010/03/26/14230.aspx

DLL出處:http://www.codeproject.com/Articles/7294/Processing-Global-Mouse-and-Keyboard-Hooks-in-C

此處記錄我如何使用,該DLL還讓我連開始、停止按鈕都可以拿掉了。

這個DLL造福了我啊!!

//註冊滑鼠移動事件
HookManager.MouseMove += HookManager_MouseMove;
//註冊鍵盤按下時事件
HookManager.KeyDown += HookManager_KeyDown;

private void HookManager_MouseMove(object sender, MouseEventArgs e)
{
	//將滑鼠移動寫到Lable中
	labelMousePosition.Text = string.Format("x={0:0000}; y={1:0000}", e.X, e.Y);
}

private void HookManager_KeyDown(object sender, KeyEventArgs e)
{
	switch (e.KeyCode)
	{
		case Keys.F5:
		   //按下F5時啟動懶人精靈,主要做:Timer.Start();
			break;
		case Keys.F6:
		  //按下F6時,停止懶人精靈,主要做:Timer.Stop();
			break;
	}
}

寫到此,第二個版本出現了。

1

靠著釘選在工具列 + 模擬滑鼠勉強達到了可以縮小視窗去做其他事情了!但是,這方法好爛。

我內心的想法實際上想要可以透過一個語法之類的去做到。

這條路走來其實我覺得蠻有挑戰的,因為對Winform其實不熟,加上做的領域很多沒接觸過,連關鍵字都不會下。

就這樣,上述這些包含Google解決控制視窗花了我兩天。打中文都死,卻不知道英文Key Word要下啥。

期間,想透過Process類別來達到,但是Try一Try還是過不了關。

有些時候鬼打牆是時間可以突破的...今天Google不到,明天可能就一個不小心Google到哩!!

最終,我在這篇文章得到了救贖:C# force form

這不就是我想要的嗎?馬上試驗一下,百分之百完美阿。

private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
[DllImport("user32.dll", EntryPoint = "SetForegroundWindow")]
public static extern bool SetForegroundWindow(IntPtr hWnd);

enum DisplayType : int
{
	SW_HIDE = 0,
	SW_NORMAL = 1,
	SW_MAXIMIZE = 3,
	SW_SHOWNOACTIVATE = 4,
	SW_SHOW = 5,
	SW_MINIMIZE = 6,
	SW_RESTORE = 9,
	SW_SHOWDEFAULT = 10
}

//找到模擬器應用程式,同時讓他恢復顯示
Process[] oProcess = Process.GetProcessesByName("HD-Frontend");
if (oProcess.Length > 0)
{
	ShowWindow(oProcess[0].MainWindowHandle, (int)DisplayType.SW_RESTORE);
	SetForegroundWindow(oProcess[0].MainWindowHandle);
	Thread.Sleep(3000);
}
else
{
	lblProcessTimes.Text = "未找到指定目標!!";
	timer1.Stop();
}

文章內有寫到一個順序問題,要先呼叫ShowWindow 然後才呼叫SetForegroundWindow

之前有找到SetForegroundWindow,看來是找了關鍵點ShowWindow和順序問題。

就在這一關鍵點終於突破,這懶人程式達到了我所想看見的產品了。

從四個步驟,進化到剩下一個步驟。

2

移到重新挑戰的點,按下去F5就可以每10分鐘自己打一次哩,這10分鐘以內你可以去晃晃Blog等,10分鐘一到,再次叫起模擬器再打一次。

就在我打這篇文章的時候,他就打了7次。

程式的背後是熱情在支撐,熱情的背後,是有一個懶人之心。

希望台灣棒球越來越好、希望全民打棒球伺服器穩定一點、希望惡意的外掛都消失。

最後,我想我不會整天掛在那裏打,因為這根本就是浪費電的行為。

自己寫出來真的會很有成就感.......................

PS:20151129 更新

附上程式碼原始碼位置:https://github.com/kkman021/BBOClickTest

此程式僅自行作為程式練習之過程,請勿惡意使用。

若他人造成任何非法事件,一概與本人無關。