找回密码
 加入
搜索
查看: 10221|回复: 17

Autoit窗口信息工具只能捕获TreeView不能获取TreeViewItem?

[复制链接]
发表于 2009-2-9 14:36:57 | 显示全部楼层 |阅读模式
现有一包含TreeView1窗口的程序(非Autoit开发),树中包含若干节点(比如:a、b、c),现在想要根据传入参数(比如传入'a')操作该程序窗口,选中对应的树节点a,做这样一款程序中遇到如标题所述问题,实现代码类似
ControlFocus("Form1", "", "TTreeView1")
MsgBox(0, '', GUICtrlRead( "TreeViewItem", 1))

因为Autoit窗口信息工具取不到TreeViewItem,本人查遍帮助,亦不知如何遍历捕获窗口中的TTreeView控件所含节点,请教各位大侠如何实现我想要的功能?望不吝指教!!

(注:不想用指定坐标击键鼠标的方法,单位家里两台机显示器大小都不一样,配多个坐标不具通用性)

[ 本帖最后由 s1113 于 2009-2-14 11:50 编辑 ]
发表于 2009-2-9 14:54:05 | 显示全部楼层
是的,不能直接获取。用他们相应的命令格式吧
 楼主| 发表于 2009-2-9 15:12:34 | 显示全部楼层

我晕

“用他们相应的命令格式吧”

我的要求不算太高,能否抛哪怕一块砖出来,而不是一粒石子?谢谢!
发表于 2009-2-9 15:20:20 | 显示全部楼层
我猜想顽固的意思是直接用那个软件的命令行操作
关于你的问题,没见到,不确定能否取到标准的treeviewitem控件,如果能当然好控制,不能的话,最好模拟操作了。。。
关于模拟操作,如果你使用相对控件的做法应该不会受分辨率影响的。。
 楼主| 发表于 2009-2-9 15:48:54 | 显示全部楼层
取到的TreeView在Autoit里可以不可以遍历所有节点?
我在Autoit帮助里没找到但不确定Autoit没有这样的功能,搜论坛也没遇见类似的提问。

我想用Autoit实现的功能类似于自动化的操作一个左侧为树,右侧为对应功能界面的ERP软件,令我不在的时候,程序亦能自动登陆,以我的身份做一些类似批转、签名等的简单操作,最后自动退出,令老板不知道我在偷懒,比如我可以关掉显示器出去玩,再把这程序挂到计划任务里……

鼠标操作不总精准,比如上次退出该要操作的软件时,是以非最大化的方式退出,它就会记住,再次进来亦为非最大化的方式;而且显示屏幕稍有调整(通过显示器上的按钮$&¥#@%-)时,程序亦受影响,总之不愿用鼠标操作原因多多,其实我已经实现了一个用鼠标操作的版本,现在想改进一些。

顽固不化莫要生气啊,我没有责怪的意思,只是混论坛常遇到高手们经常惜言如金,本能的抵制被别人不屑的自我感觉,咳……
发表于 2009-2-9 16:13:09 | 显示全部楼层
也许我说的简单了点,AU3没有一个直接的函数去取得treeview的节点,与treeview相应的函数只有一个:ControlTreeView

对节点操作还得用其规定的相应命令。这个你看帮助就知到一二,我的体验是一些命令对于某些树形窗也不是都准确的。
 楼主| 发表于 2009-2-9 16:47:43 | 显示全部楼层
谢了!各位兄弟!!

主要是我玩Autoit时间不长,因为只最近一两天有时间搞这个程序又急切的想确定,觉得总有两全其美的解决办法;其实还有一个类似的问题没问,搞Delphi的朋友一定用过第三方组件,不知这样的控件类在Autoit中没有对应时,想来最后只剩下鼠标操作这一步了……

这个问题有点儿不了了之的味道,咳~~
发表于 2009-2-9 18:14:03 | 显示全部楼层
历遍  自己改一下
$All = ControlTreeView("桌面", "", "SysTreeView321", "GetItemCount", "#0")
For $I = 0 To $All - 1
        $ItemTxt = ControlTreeView("桌面", "", "SysTreeView321", "GetText", "#0|#" & $I)
Next

评分

参与人数 1贡献 +2 收起 理由
lynfr8 + 2 我很赞同

查看全部评分

发表于 2009-2-10 13:42:09 | 显示全部楼层
先定义个句柄赋值为读取的treeview,就行了吧
$hTreeview=GUICtrlRead( "TreeView", 1)
$item=Guictrlread($hTreeview)
$itemtexr=GUICtrlRead($item, 1)

[ 本帖最后由 netegg 于 2009-2-10 13:49 编辑 ]
 楼主| 发表于 2009-2-11 23:20:53 | 显示全部楼层

多谢各位兄弟的热心指点,不胜感激!!

最近忙别的事情两天没来,抱歉!

sxd 的方法为正解,只其中的"桌面"经查要用变量$gui=WinGetHandle("classname=TForm1", "")来替代。
发表于 2009-2-12 00:04:15 | 显示全部楼层
原帖由 s1113 于 2009-2-11 23:20 发表
最近忙别的事情两天没来,抱歉!

sxd 的方法为正解,只其中的"桌面"经查要用变量$gui=WinGetHandle("classname=TForm1", "")来替代。


桌面只是测试用吗 用你的句柄
 楼主| 发表于 2009-2-14 11:45:41 | 显示全部楼层
高手就是写意,哈哈!
说的越多,菜的问题就越多,送佛送到西,每个都这样,后来就惜言如金了(跟帖的情况);另一个极端是详篇大论、普及推广开专题贴。

现在是多帮少说的策略,悟性能跟进的就其情况再点一句,解答过后仍不知所云的,自生自灭好了(其实亦有高手二代、高手三代的类推情况,终有覆盖到菜级的解答),这是自然而然的选择,怪不得个个论坛都是如此!
 楼主| 发表于 2009-2-14 11:50:13 | 显示全部楼层
当然说的少却不能反推是高手。
发表于 2009-5-15 00:36:29 | 显示全部楼层
http://www.autoitx.com/forum.php?mod=viewthread&tid=7051&highlight
请大家移步到以上链接,回复贴有相关附件下载

我琢磨了一下
结合sxdnetegg 的启发

ControlTreeView ( "title", "text", controlID, "command" [, option1 [, option2]] )
参数:
command  ---> The command to send to the control
option1  --- >[optional] Additional parameter required by some commands.

其中command有一个命令为"GetText": Returns the text of an item.

再看option的应用说明:
The "item" parameter is a string-based parameter that is used to reference a particular treeview item using a combination of text and indices. Indices are 0-based.

举例:
Heading1
----> H1SubItem1
----> H1SubItem2
----> H1SubItem3
----> ----> H1S1SubItem1
Heading2
Heading3


Each "level" is separated by |. An index is preceded with #.

对应上面举例再深入举一个例子:
Heading2可表达为 "Heading2" 或"#1"
H1SubItem2 可表达为"Heading1|H1SubItem2" 或"#0|#1"
H1S1SubItem1 可表达为"Heading1|H1SubItem3|H1S1SubItem1" 或"#0|#2|#0"


如此,就可知道怎么读取楼主提出的类似窗体的内容啦

为了大家看着容易明白,我写了一个"读取温度仪",遇上过这个问题的可以参考一下:

  • #include <GUIConstantsEx.au3>
  • #Include <GuiListbox.au3>
  • Local $a,$Msg,$temp,$temp1,$temp2,$temp3,$temp4
  • $a = 'CPUID Hardware Monitor'
  • WinActivate($a,'')
  • GUICreate(" 读取温度仪 ", 320, 220, @DesktopWidth / 2 - 160, @DesktopHeight / 2 - 45, -1, 0x00000018)
  • GUISetBkColor(0x666FF )
  • GUICtrlCreateLabel("By lynfr8"&@CRLF&"2009.5.14", 200, 165, 60, 40)
  • GUICtrlCreateLabel("使用说明:"&@CRLF&"请先打开 Hardware Monitor"&@CRLF&"然后点击你需查看的温度", 50, 25, 300, 50)
  • $temp1 = GUICtrlCreateButton("主板温度", 40, 85, 100, 20)
  • $temp2 = GUICtrlCreateButton("cpu温度", 40, 105, 100, 20)
  • $temp3 = GUICtrlCreateButton("显卡温度", 40, 125, 100, 20)
  • $temp4 = GUICtrlCreateButton("硬盘温度", 40, 145, 100, 20)
  • GUISetState()
  • While 1
  • $Msg = GUIGetMsg()
  • Switch $Msg
  • Case $GUI_EVENT_CLOSE
  • Exit
  • Case $temp1
  • temp1()
  • Case $temp2
  • temp2()
  • Case $temp3
  • temp3()
  • Case $temp4
  • temp4()
  • EndSwitch
  • WEnd
  • Func temp1()
  • $temp = ControlTreeView($a, "", "SysTreeView321", "GetText", "#0|#0|#1|#0")
  • MsgBox(4096,'',"主板温度:"&$temp)
  • EndFunc
  • Func temp2()
  • $temp = ControlTreeView($a, "", "SysTreeView321", "GetText", "#0|#1|#0|#0")
  • MsgBox(4096,'',"cpu温度:"&$temp)
  • EndFunc
  • Func temp3()
  • $temp = ControlTreeView($a, "", "SysTreeView321", "GetText", "#0|#2|#0|#0")
  • MsgBox(4096,'',"显卡温度:"&$temp)
  • EndFunc
  • Func temp4()
  • $temp = ControlTreeView($a, "", "SysTreeView321", "GetText", "#0|#3|#0|#0")
  • MsgBox(4096,'',"硬盘温度:"&$temp)
  • EndFunc
发表于 2009-5-15 00:44:42 | 显示全部楼层
如果需要全部数据取出来加个if..then..递归就可以了
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-11-16 10:41 , Processed in 0.109979 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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