本文在文章開始,先介紹下視窗的抓取軟體,Spy++及AccExplorer32.exe,前者是大名鼎鼎的微軟出品,幾乎可以抓取所有的Windows視窗及控制項(其實也是一個視窗),另外一個也是類似,功能可以互補一下。
首先看看兩者的介面,在抓取QQ的【尋找連絡人/群/企業】的視窗時候的情況:
Sp++的介面
AccExplorer32.exe介面
兩者介面不同,不過準系統有重疊,Spy++提供的功能可能會更多一些,這兩個軟體都可以對列出的視窗進行一系列的操作,如可以找到相關的視窗資訊,視窗位置,以及對各種視窗操作的資訊,包括滑鼠、鍵盤等一系列的操作都可以類比出來,非常強大。
為了類比抓取視窗以及對視窗的各種操作,我們可以通過FindWindow和FindWindowEx、SendMessage、PostMessage等Windows訊息來進行處理,便可實現基本的視窗、控制項操作,另外按鈕的操作,我們則可以類比按一下滑鼠某個座標點的方式實現按鈕的單擊操作類比。 類比的QQ介面視窗如下所示,是一個尋找視窗的。
我們通過抓取視窗資訊,我們看到該視窗下面只有兩個可見視窗,分別對應兩個輸入控制項,可以發現該視窗的一個輸入(帳號和暱稱輸入框中的任何一個)的Class 名稱如下所示:
首先我們來建立一個介面,如下所示,用來類比相關的操作。
我們在輔助類中定義幾個函數用來實現視窗的操作
[DllImport("user32.dll")]
private static extern IntPtr FindWindowEx(IntPtr parent, IntPtr childAfter, string className, string windowName);
[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);
在實際的按鈕作業碼中,我們簡化了具體的操作,只需要調用輔助類就可以了
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++監控出來的資訊。
最後結果如下所示,實現控制項內容的修改,並執行了單擊按鈕的操作,彈出添加好友確認資訊。
如果要進行進一步的操作,在繼續對彈出的視窗進一步分析即可,其他所有的視窗操作,原理一樣,這樣就可以實現很多程式的自動類比操作,是不是很方便呢。