51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 4555|回复: 12
打印 上一主题 下一主题

[原创] 关于winlistview的columncount()方法

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2008-12-11 21:00:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我测试的程序是用C++开发的。
为什么在获取winlistview控件后使用columncount方法时报错,

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

  • TA的每日心情
    开心
    2016-2-27 08:48
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]测试小兵

    2#
    发表于 2008-12-15 10:07:25 | 只看该作者
    运行 Msgbox Dialog("Picasa Web Albums" ).WinListView("单击右侧的按钮,并输入登录信息。")后看看此 WinListView对象 是否存在。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2016-2-27 08:48
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]测试小兵

    3#
    发表于 2008-12-15 10:07:58 | 只看该作者
    如果此对象存在,那么就应该可以使用columncount方法
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    4#
     楼主| 发表于 2008-12-16 16:28:44 | 只看该作者
    原帖由 walker1020 于 2008-12-15 10:07 发表
    如果此对象存在,那么就应该可以使用columncount方法

    此对象存在,但使用columncount()方法时报run error对话框中的错误。
    图pic2中的红色区域的信息是从上一个界面pic3中红色区域得到的。跟这个有关系吗?

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

    x
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    5#
     楼主| 发表于 2008-12-16 16:29:58 | 只看该作者
    版主帮忙啊!!!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    6#
     楼主| 发表于 2008-12-18 10:42:17 | 只看该作者
    问题还没解决,自己顶下.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    7#
     楼主| 发表于 2008-12-18 11:29:50 | 只看该作者
    举一个无法使用columncount()方法的例子:
    使用window打开任意一个文件夹,察看方式选择[详细],这时文件夹窗体中存在很多列,如:名称,大小等。我想取得列的总数和列名。

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

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

    x
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    8#
    发表于 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。
    我想差不多这就是其中的微妙区别了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
     楼主| 发表于 2008-12-18 19:56:18 | 只看该作者
    太感谢楼上的指点了。
    能否再帮忙解答一下,如果无法使用columncount方法,那我怎么才能取到column的信息,比如每列标题的名称?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
     楼主| 发表于 2008-12-20 22:00:21 | 只看该作者
    自己顶下,问题还没解决,各位帮忙啊!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    11#
    发表于 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 编辑 ]
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    12#
    发表于 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,调用起来方便。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
     楼主| 发表于 2008-12-31 09:19:16 | 只看该作者
    太感谢楼上的回答了,我的好好研究研究。再次感谢。
    回复 支持 反对

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-8 11:56 , Processed in 0.079304 second(s), 29 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表