关于winlistview的columncount()方法
我测试的程序是用C++开发的。为什么在获取winlistview控件后使用columncount方法时报错,
QTP有C++插件吗?是由于插件的原因吗?
我用相同的方法在C#开发的程序上使用就可以。
那位帮帮我啊,都折磨我好久了... 运行 Msgbox Dialog("Picasa Web Albums" ).WinListView("单击右侧的按钮,并输入登录信息。")后看看此 WinListView对象 是否存在。 如果此对象存在,那么就应该可以使用columncount方法 原帖由 walker1020 于 2008-12-15 10:07 发表 http://bbs.51testing.com/images/common/back.gif
如果此对象存在,那么就应该可以使用columncount方法
此对象存在,但使用columncount()方法时报run error对话框中的错误。
图pic2中的红色区域的信息是从上一个界面pic3中红色区域得到的。跟这个有关系吗? 版主帮忙啊!!! 问题还没解决,自己顶下. 举一个无法使用columncount()方法的例子:
使用window打开任意一个文件夹,察看方式选择[详细],这时文件夹窗体中存在很多列,如:名称,大小等。我想取得列的总数和列名。
每列的标题部分可以被识别成winobject对象,但是是一个整体,包含所有的列,能通过这个分别取出每个列名吗? 和楼主一样,一开始我也很困惑,为什么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。
我想差不多这就是其中的微妙区别了。 太感谢楼上的指点了。
能否再帮忙解答一下,如果无法使用columncount方法,那我怎么才能取到column的信息,比如每列标题的名称? 自己顶下,问题还没解决,各位帮忙啊! 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 编辑 ] 又研究了一下,之前没有取到列数是因为获得的窗口句柄不对,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,调用起来方便。 太感谢楼上的回答了,我的好好研究研究。再次感谢。
页:
[1]