本文在文章開始,先介紹下窗口的抓取軟件,Spy++及AccExplorer32.exe,前者是大名鼎鼎的微軟出品,幾乎可以抓取所有的Windows窗口及控件(其實也是一個窗口),另外一個也是類似,功能可以互補一下。
首先看看兩者的界面,在抓取QQ的【查找聯(lián)系人/群/企業(yè)】的窗口時候的情況:
Sp++的界面
AccExplorer32.exe界面
兩者界面不同,不過基本功能有重疊,Spy++提供的功能可能會更多一些,這兩個軟件都可以對列出的窗口進行一系列的操作,如可以找到相關(guān)的窗口信息,窗口位置,以及對各種窗口操作的信息,包括鼠標(biāo)、鍵盤等一系列的操作都可以模擬出來,非常強大。
為了模擬抓取窗口以及對窗口的各種操作,我們可以通過FindWindow和FindWindowEx、SendMessage、PostMessage等Windows消息來進行處理,便可實現(xiàn)基本的窗口、控件操作,另外按鈕的操作,我們則可以模擬鼠標(biāo)單擊某個坐標(biāo)點的方式實現(xiàn)按鈕的單擊操作模擬。 模擬的QQ界面窗口如下所示,是一個查找窗口的。
我們通過抓取窗口信息,我們看到該窗口下面只有兩個可見窗口,分別對應(yīng)兩個輸入控件,可以發(fā)現(xiàn)該窗口的一個輸入(賬號和昵稱輸入框中的任何一個)的Class 名稱如下所示:
首先我們來創(chuàng)建一個界面,如下所示,用來模擬相關(guān)的操作。
我們在輔助類中定義幾個函數(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);
在實際的按鈕操作代碼中,我們簡化了具體的操作,只需要調(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);
}
其中位置信息時通過Spy++監(jiān)控出來的信息。
最后結(jié)果如下所示,實現(xiàn)控件內(nèi)容的修改,并執(zhí)行了單擊按鈕的操作,彈出添加好友確認信息。
如果要進行進一步的操作,在繼續(xù)對彈出的窗口進一步分析即可,其他所有的窗口操作,原理一樣,這樣就可以實現(xiàn)很多程序的自動模擬操作,是不是很方便呢。