本文在文章開始,先介紹下窗口的抓取軟件,Spy++及AccExplorer32.exe,前者是大名鼎鼎的微軟出品,幾乎可以抓取所有的Windows窗口及控件(其實(shí)也是一個(gè)窗口),另外一個(gè)也是類似,功能可以互補(bǔ)一下。
首先看看兩者的界面,在抓取QQ的【查找聯(lián)系人/群/企業(yè)】的窗口時(shí)候的情況:
Sp++的界面
AccExplorer32.exe界面
兩者界面不同,不過(guò)基本功能有重疊,Spy++提供的功能可能會(huì)更多一些,這兩個(gè)軟件都可以對(duì)列出的窗口進(jìn)行一系列的操作,如可以找到相關(guān)的窗口信息,窗口位置,以及對(duì)各種窗口操作的信息,包括鼠標(biāo)、鍵盤等一系列的操作都可以模擬出來(lái),非常強(qiáng)大。
為了模擬抓取窗口以及對(duì)窗口的各種操作,我們可以通過(guò)FindWindow和FindWindowEx、SendMessage、PostMessage等Windows消息來(lái)進(jìn)行處理,便可實(shí)現(xiàn)基本的窗口、控件操作,另外按鈕的操作,我們則可以模擬鼠標(biāo)單擊某個(gè)坐標(biāo)點(diǎn)的方式實(shí)現(xiàn)按鈕的單擊操作模擬。 模擬的QQ界面窗口如下所示,是一個(gè)查找窗口的。
我們通過(guò)抓取窗口信息,我們看到該窗口下面只有兩個(gè)可見窗口,分別對(duì)應(yīng)兩個(gè)輸入控件,可以發(fā)現(xiàn)該窗口的一個(gè)輸入(賬號(hào)和昵稱輸入框中的任何一個(gè))的Class 名稱如下所示:
首先我們來(lái)創(chuàng)建一個(gè)界面,如下所示,用來(lái)模擬相關(guān)的操作。
我們?cè)谳o助類中定義幾個(gè)函數(shù)用來(lái)實(shí)現(xiàn)窗口的操作
[DllImport("user32.dll")]
[DllImport("user32.dll", EntryPoint = "FindWindow")]
private static extern IntPtr FindWindowWin32(string className, string windowName);
[DllImport("user32.dll ")]
public static extern int GetClassName(IntPtr hWnd, [Out] StringBuilder className, int maxCount);
[DllImport("user32.dll")]
private static extern int SendMessage(IntPtr window, int message, int wparam, int lparam);
[DllImport("user32", CharSet = CharSet.Auto)]
private extern static int SendMessage(IntPtr hWnd, int wMsg, int wParam, string lpstring);
[DllImport("user32.dll")]
private static extern int PostMessage(IntPtr window, int message, int wparam, int lparam);
在實(shí)際的按鈕操作代碼中,我們簡(jiǎn)化了具體的操作,只需要調(diào)用輔助類就可以了
private void btnSearch_Click(object sender, EventArgs e)
Win32Window win = Win32Window.FindWindow(null, this.txtWindowName.Text);
if (win != null)
{
ArrayList list = win.Children;
foreach (Win32Window sub in list)
{
if (sub.Visible && sub.ClassName == "ATL:30A4D1D8")
{
sub.SendMessage(WindowMessage.WM_SETTEXT, 0, this.txtInput.Text);
}
}
}
int x = 288;
int y = 328;
win.ClickWindow("left", x, y, false);
}
其中位置信息時(shí)通過(guò)Spy++監(jiān)控出來(lái)的信息。
最后結(jié)果如下所示,實(shí)現(xiàn)控件內(nèi)容的修改,并執(zhí)行了單擊按鈕的操作,彈出添加好友確認(rèn)信息。
如果要進(jìn)行進(jìn)一步的操作,在繼續(xù)對(duì)彈出的窗口進(jìn)一步分析即可,其他所有的窗口操作,原理一樣,這樣就可以實(shí)現(xiàn)很多程序的自動(dòng)模擬操作,是不是很方便呢。