cebola 发表于 2008-12-11 21:00:10

关于winlistview的columncount()方法

我测试的程序是用C++开发的。
为什么在获取winlistview控件后使用columncount方法时报错,

QTP有C++插件吗?是由于插件的原因吗?
我用相同的方法在C#开发的程序上使用就可以。
那位帮帮我啊,都折磨我好久了...

walker1020 发表于 2008-12-15 10:07:25

运行 Msgbox Dialog("Picasa Web Albums" ).WinListView("单击右侧的按钮,并输入登录信息。")后看看此 WinListView对象 是否存在。

walker1020 发表于 2008-12-15 10:07:58

如果此对象存在,那么就应该可以使用columncount方法

cebola 发表于 2008-12-16 16:28:44

原帖由 walker1020 于 2008-12-15 10:07 发表 http://bbs.51testing.com/images/common/back.gif
如果此对象存在,那么就应该可以使用columncount方法
此对象存在,但使用columncount()方法时报run error对话框中的错误。
图pic2中的红色区域的信息是从上一个界面pic3中红色区域得到的。跟这个有关系吗?

cebola 发表于 2008-12-16 16:29:58

版主帮忙啊!!!

cebola 发表于 2008-12-18 10:42:17

问题还没解决,自己顶下.

cebola 发表于 2008-12-18 11:29:50

举一个无法使用columncount()方法的例子:
使用window打开任意一个文件夹,察看方式选择[详细],这时文件夹窗体中存在很多列,如:名称,大小等。我想取得列的总数和列名。

每列的标题部分可以被识别成winobject对象,但是是一个整体,包含所有的列,能通过这个分别取出每个列名吗?

asoqa 发表于 2008-12-18 17:51:42

和楼主一样,一开始我也很困惑,为什么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:18

太感谢楼上的指点了。
能否再帮忙解答一下,如果无法使用columncount方法,那我怎么才能取到column的信息,比如每列标题的名称?

cebola 发表于 2008-12-20 22:00:21

自己顶下,问题还没解决,各位帮忙啊!

asoqa 发表于 2008-12-22 12:12:30

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:53

又研究了一下,之前没有取到列数是因为获得的窗口句柄不对,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:16

太感谢楼上的回答了,我的好好研究研究。再次感谢。
页: [1]
查看完整版本: 关于winlistview的columncount()方法