本文在文章开始,先介绍下窗口的抓取软件,Spy++及AccExplorer32.exe,前者是大名鼎鼎的微软出品,几乎可以抓取所有的Windows窗口及控件(其实也是一个窗口),另外一个也是类似,功能可以互补一下。
首先看看两者的界面,在抓取QQ的【查找联系人/群/企业】的窗口时候的情况:
Sp++的界面
AccExplorer32.exe界面
两者界面不同,不过基本功能有重叠,Spy++提供的功能可能会更多一些,这两个软件都可以对列出的窗口进行一系列的操作,如可以找到相关的窗口信息,窗口位置,以及对各种窗口操作的信息,包括鼠标、键盘等一系列的操作都可以模拟出来,非常强大。
为了模拟抓取窗口以及对窗口的各种操作,我们可以通过FindWindow和FindWindowEx、SendMessage、PostMessage等Windows消息来进行处理,便可实现基本的窗口、控件操作,另外按钮的操作,我们则可以模拟鼠标单击某个坐标点的方式实现按钮的单击操作模拟。 模拟的QQ界面窗口如下所示,是一个查找窗口的。
我们通过抓取窗口信息,我们看到该窗口下面只有两个可见窗口,分别对应两个输入控件,可以发现该窗口的一个输入(账号和昵称输入框中的任何一个)的Class 名称如下所示:
首先我们来创建一个界面,如下所示,用来模拟相关的操作。
我们在辅助类中定义几个函数用来实现窗口的操作
[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);
在实际的按钮操作代码中,我们简化了具体的操作,只需要调用辅助类就可以了
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++监控出来的信息。
最后结果如下所示,实现控件内容的修改,并执行了单击按钮的操作,弹出添加好友确认信息。
如果要进行进一步的操作,在继续对弹出的窗口进一步分析即可,其他所有的窗口操作,原理一样,这样就可以实现很多程序的自动模拟操作,是不是很方便呢。