51Testing软件测试论坛
标题:
关于winlistview的columncount()方法
[打印本页]
作者:
cebola
时间:
2008-12-11 21:00
标题:
关于winlistview的columncount()方法
我测试的程序是用C++开发的。
为什么在获取winlistview控件后使用columncount方法时报错,
QTP有C++插件吗?是由于插件的原因吗?
我用相同的方法在C#开发的程序上使用就可以。
那位帮帮我啊,都折磨我好久了...
作者:
walker1020
时间:
2008-12-15 10:07
运行 Msgbox Dialog("Picasa Web Albums" ).WinListView("单击右侧的按钮,并输入登录信息。")后看看此 WinListView对象 是否存在。
作者:
walker1020
时间:
2008-12-15 10:07
如果此对象存在,那么就应该可以使用columncount方法
作者:
cebola
时间:
2008-12-16 16:28
原帖由
walker1020
于 2008-12-15 10:07 发表
如果此对象存在,那么就应该可以使用columncount方法
此对象存在,但使用columncount()方法时报run error对话框中的错误。
图pic2中的红色区域的信息是从上一个界面pic3中红色区域得到的。跟这个有关系吗?
作者:
cebola
时间:
2008-12-16 16:29
版主帮忙啊!!!
作者:
cebola
时间:
2008-12-18 10:42
问题还没解决,自己顶下.
作者:
cebola
时间:
2008-12-18 11:29
举一个无法使用columncount()方法的例子:
使用window打开任意一个文件夹,察看方式选择[详细],这时文件夹窗体中存在很多列,如:名称,大小等。我想取得列的总数和列名。
每列的标题部分可以被识别成winobject对象,但是是一个整体,包含所有的列,能通过这个分别取出每个列名吗?
作者:
asoqa
时间:
2008-12-18 17:51
和楼主一样,一开始我也很困惑,为什么windows资源管理器的winlistview无法用columncount,而任务管理器可以。后来我又试了一下WinRar的winlistview,发现columncount是可以用的。两者有什么差别,从表面上看windows资源管理器可以选择不同风格的查看方式,而任务管理器和winrar都不可以,两种同样都是winlistview,但是风格不一致。说明其属性不一致,后来我用Spy++对比了一下两种winlistview的属性,发现一个很重要的差别,就是资源管理器的winlistview没有LVS_REPORT这个属性,而其他两个是有的。这是突然想起QTP帮助中ColumnCount方法有一个注释“Returns the number of columns in the (report-style) list-view object. ”,指定了是Report-Style。
我想差不多这就是其中的微妙区别了。
作者:
cebola
时间:
2008-12-18 19:56
太感谢楼上的指点了。
能否再帮忙解答一下,如果无法使用columncount方法,那我怎么才能取到column的信息,比如每列标题的名称?
作者:
cebola
时间:
2008-12-20 22:00
自己顶下,问题还没解决,各位帮忙啊!
作者:
asoqa
时间:
2008-12-22 12:12
Extern.Declare micHwnd, "FindWindow", "user32.dll", "FindWindowA", micString, micString
Extern.Declare micHwnd, "FindWindowEx", "user32.dll", "FindWindowExA", micHwnd, micHwnd, micString, micString
Extern.Declare micHwnd, "SendMessage", "user32.dll", "SendMessageA", micHwnd, micLong, micLong, micLong
Hwnd = extern.FindWindowEx(0,0,vbNullString, "选择文件")
Hwnd1 = extern.FindWindowEx(Hwnd,0,"SHELLDLL_DefView", vbNullString)
Hwnd2 = extern.FindWindowEx(Hwnd1,0,"SysListView32", vbNullString)
MessageCode = &HF11B 'LVM_GETCOLUMNOUNT
cols = extern.SendMessage(hwnd2,MessageCode, 0, 0)
以上代码,我试了一下用Windows的api尝试获取列数,但是返回结果为0。如果查LVM_GETITEMCOUNT,对应的code是&H1004,是可以获取的。查了一下MSDN,没有找到支持从外部获取GETCOLUMNCOUNT的方法,这个你可能要问微软了。
实在不行,你只能用虚拟对象解决了,虽然我很不喜欢,但是这种情况下也只能尝试一下虚拟对象了。
[
本帖最后由 asoqa 于 2008-12-22 12:14 编辑
]
作者:
asoqa
时间:
2008-12-23 14:13
又研究了一下,之前没有取到列数是因为获得的窗口句柄不对,SysListView32不支持直接获取列数,需要定位到SysHeader32再取列,就可以了。如下代码:
Extern.Declare micHwnd, "FindWindow", "user32.dll", "FindWindowA", micString, micString
Extern.Declare micHwnd, "FindWindowEx", "user32.dll", "FindWindowExA", micHwnd, micHwnd, micString, micString
Extern.Declare micHwnd, "SendMessage", "user32.dll", "SendMessageA", micHwnd, micLong, micLong, micLong
Hwnd = extern.FindWindowEx(0,0,vbNullString, "Windows 任务管理器")
Hwnd1 = extern.FindWindowEx(Hwnd,0,"#32770", vbNullString)
Hwnd2 = extern.FindWindowEx(Hwnd1,0,"SysListView32", vbNullString)
Hwnd3 = extern.FindWindowEx(Hwnd2,0, "SysHeader32", vbNullString)
MessageCode = &H1200 'HDM_GETITEMCOUNT
columnCount = extern.SendMessage(Hwnd3,MessageCode,0, 0)
至于列名一样可以取到,不过要复杂点。用vbs比较麻烦,建议写个dll,调用起来方便。
作者:
cebola
时间:
2008-12-31 09:19
太感谢楼上的回答了,我的好好研究研究。再次感谢。
欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/)
Powered by Discuz! X3.2