mike_seaver 2006-10-26 13:17
原创小工具,利用MSAA技术,获取鼠标指定位置的窗口或窗口子项的基本信息
自做小工具,类似spy++部分的鼠标获取指定对象的功能。
此工具与spy++相比,可获得对象的粒度更小,可以取得最小窗体内的所有子项。例如TreeView控件中的每个节点的基本信息!
同时还可读取密码框内的密码信息!
如果大家有兴趣,可以试用并提出宝贵意见!
我准备桌一套简单的UI测试用工具,这个小工具算是项目的启动吧!
目前此版本支持:
WinXP, Win2000或以上
IE 6.0
谢谢大家支持!!!
mike_seaver 2006-10-27 11:09
自己顶一下!
本软件非黑客软件,其目的是测试使用,所以对于密码框,此工具只对标准的Edit控件有效,而对一些具有防范措施的控件无效,例如:重载了WM_GETTEXT消息的密码框,QQ就是一个例子。
谢谢大家支持啊!!!
lanstudy 2007-5-18 20:00
回复 #1 mike_seaver 的帖子
不错啊?有机会交流一下哈....
Silent_Eye 2007-7-25 12:45
我正好要做个UI自动测试的东西,lz请加我QQ:53693710
谢谢
tina0418 2007-12-14 16:11
正好需要,可以参考下
sihanjishu 2008-7-30 19:23
最近我也在研究msaa。这个小工具挺好的。
sihanjishu 2008-7-31 11:32
回复 1# 的帖子
请教楼主一个问题。
下面是我使用c#代码,捕获aa的例子。结果一直是捕获不出来,可否指点一下,是什么原因。你的那个小工具,写的很好,超稳定。
这是一个捕获遨游工具栏的程序。
问题
1、 IntPtr hwnd2 = FindWindowEx(hWnd, IntPtr.Zero, "XTPToolBar", "标准工具栏");
这个函数返回了空值。不明白为什么。遨游浏览器里有很多的XTPToolBar,所以我才加入了标题。
2、 我尝试了其他的控件,比如火狐浏览器的控件。
在找到子窗口对应的aa后,调用
AccessibleChildren(accessible, 0, accessible.accChildCount - 1, childs, out obtained);
竟然不能得到他们的子对象。即使父对象里显示有多个子对象。得到的childs是空的数组。
public static void msaa()
{
object obj = new object();
IntPtr hWnd = FindWindowEx(IntPtr.Zero, IntPtr.Zero, "Maxthon2_Frame", null);//get the parent hwnd
IntPtr hwnd2 = FindWindowEx(hWnd, IntPtr.Zero, "XTPToolBar", "标准工具栏"); //get the sub window
Guid guid = new Guid("{618736E0-3C3D-11CF-810C-00AA00389B71}");
AccessibleObjectFromWindow(hwnd2, 0x00000000, ref guid, ref obj);//get the aa object
IAccessible accessible = obj as IAccessible;
accessible = accessible.accParent as IAccessible;//get the parent aa object
Object[] childs = new Object[accessible.accChildCount]; //set a array to receive the sub aa object list
int obtained = 0;
AccessibleChildren(accessible, 0, accessible.accChildCount - 1, childs, out obtained);//get the sub aa objects
Console.WriteLine(obtained.ToString());//print count to verify the result
//print relative information ,not very importent .
for (int i = 0; i < obtained; i++)
{
IAccessible child = childs[i] as IAccessible;
try { Console.WriteLine(child.get_accName(0)); }
catch { }
Object[] accchilds = new Object[child.accChildCount];
int result = 0;
AccessibleChildren(child, 0, child.accChildCount - 1, accchilds, out result);
for (int j = 0; j < result; j++)
{
IAccessible jchild = accchilds[j] as IAccessible;
Console.WriteLine(jchild.get_accName(0));
}
}
Console.ReadLine();
}