全民打棒球 小小工具
寫程式,真的要熱情去支持你!我不想我哪一天變成一句寫程式的活屍。
最近迷上全民打棒球手機版,喜歡上原因很間單,我算是半個球迷。(偶爾看看,重大賽事就瘋狂)
但是,令人失望的事情是,伺服器真的不太好,而且看到數字網友在再賣道具,大概就是外掛了。
我功力不夠強,封包就是看不懂,有強者可以領進門再拜託了!!
好吧!網路上有人教1:1對戰怎樣用按鍵精靈,但是,還要設定來設定去。
把心一橫,六日就來寫屬於自己的產品嚕!!
假設立場:伺服器一切穩當,只需要重覆的打。
目標:
- 可以設定間隔時間。
- 簡單,懶人
- 步驟再多就不好嚕!
好啦!需求定義清楚,客戶就是我自己,不會有澳客煩惱,出發!!
工作內容:
- 滑鼠移動到定點。
- 滑鼠模擬按下。
- 一定時間後,重覆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;
}
}
寫到此,第二個版本出現了。
靠著釘選在工具列 + 模擬滑鼠勉強達到了可以縮小視窗去做其他事情了!但是,這方法好爛。
我內心的想法實際上想要可以透過一個語法之類的去做到。
這條路走來其實我覺得蠻有挑戰的,因為對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和順序問題。
就在這一關鍵點終於突破,這懶人程式達到了我所想看見的產品了。
從四個步驟,進化到剩下一個步驟。
移到重新挑戰的點,按下去F5就可以每10分鐘自己打一次哩,這10分鐘以內你可以去晃晃Blog等,10分鐘一到,再次叫起模擬器再打一次。
就在我打這篇文章的時候,他就打了7次。
程式的背後是熱情在支撐,熱情的背後,是有一個懶人之心。
希望台灣棒球越來越好、希望全民打棒球伺服器穩定一點、希望惡意的外掛都消失。
最後,我想我不會整天掛在那裏打,因為這根本就是浪費電的行為。
自己寫出來真的會很有成就感.......................
PS:20151129 更新
附上程式碼原始碼位置:https://github.com/kkman021/BBOClickTest
此程式僅自行作為程式練習之過程,請勿惡意使用。
若他人造成任何非法事件,一概與本人無關。