Autoit窗口信息工具只能捕获TreeView不能获取TreeViewItem?
现有一包含TreeView1窗口的程序(非Autoit开发),树中包含若干节点(比如:a、b、c),现在想要根据传入参数(比如传入'a')操作该程序窗口,选中对应的树节点a,做这样一款程序中遇到如标题所述问题,实现代码类似ControlFocus("Form1", "", "TTreeView1")
MsgBox(0, '', GUICtrlRead( "TreeViewItem", 1))
因为Autoit窗口信息工具取不到TreeViewItem,本人查遍帮助,亦不知如何遍历捕获窗口中的TTreeView控件所含节点,请教各位大侠如何实现我想要的功能?望不吝指教!!
(注:不想用指定坐标击键鼠标的方法,单位家里两台机显示器大小都不一样,配多个坐标不具通用性)
[ 本帖最后由 s1113 于 2009-2-14 11:50 编辑 ] 是的,不能直接获取。用他们相应的命令格式吧
我晕
“用他们相应的命令格式吧”我的要求不算太高,能否抛哪怕一块砖出来,而不是一粒石子?谢谢! 我猜想顽固的意思是直接用那个软件的命令行操作
关于你的问题,没见到,不确定能否取到标准的treeviewitem控件,如果能当然好控制,不能的话,最好模拟操作了。。。
关于模拟操作,如果你使用相对控件的做法应该不会受分辨率影响的。。 取到的TreeView在Autoit里可以不可以遍历所有节点?
我在Autoit帮助里没找到但不确定Autoit没有这样的功能,搜论坛也没遇见类似的提问。
我想用Autoit实现的功能类似于自动化的操作一个左侧为树,右侧为对应功能界面的ERP软件,令我不在的时候,程序亦能自动登陆,以我的身份做一些类似批转、签名等的简单操作,最后自动退出,令老板不知道我在偷懒,比如我可以关掉显示器出去玩,再把这程序挂到计划任务里……
鼠标操作不总精准,比如上次退出该要操作的软件时,是以非最大化的方式退出,它就会记住,再次进来亦为非最大化的方式;而且显示屏幕稍有调整(通过显示器上的按钮$&¥#@%-)时,程序亦受影响,总之不愿用鼠标操作原因多多,其实我已经实现了一个用鼠标操作的版本,现在想改进一些。
顽固不化莫要生气啊,我没有责怪的意思,只是混论坛常遇到高手们经常惜言如金,本能的抵制被别人不屑的自我感觉,咳…… 也许我说的简单了点,AU3没有一个直接的函数去取得treeview的节点,与treeview相应的函数只有一个:ControlTreeView
对节点操作还得用其规定的相应命令。这个你看帮助就知到一二,我的体验是一些命令对于某些树形窗也不是都准确的。 谢了!各位兄弟!!
主要是我玩Autoit时间不长,因为只最近一两天有时间搞这个程序又急切的想确定,觉得总有两全其美的解决办法;其实还有一个类似的问题没问,搞Delphi的朋友一定用过第三方组件,不知这样的控件类在Autoit中没有对应时,想来最后只剩下鼠标操作这一步了……
这个问题有点儿不了了之的味道,咳~~ 历遍自己改一下
$All = ControlTreeView("桌面", "", "SysTreeView321", "GetItemCount", "#0")
For $I = 0 To $All - 1
$ItemTxt = ControlTreeView("桌面", "", "SysTreeView321", "GetText", "#0|#" & $I)
Next 先定义个句柄赋值为读取的treeview,就行了吧
$hTreeview=GUICtrlRead( "TreeView", 1)
$item=Guictrlread($hTreeview)
$itemtexr=GUICtrlRead($item, 1)
[ 本帖最后由 netegg 于 2009-2-10 13:49 编辑 ]
多谢各位兄弟的热心指点,不胜感激!!
最近忙别的事情两天没来,抱歉!sxd 的方法为正解,只其中的"桌面"经查要用变量$gui=WinGetHandle("classname=TForm1", "")来替代。 原帖由 s1113 于 2009-2-11 23:20 发表 http://www.autoitx.com/images/common/back.gif
最近忙别的事情两天没来,抱歉!
sxd 的方法为正解,只其中的"桌面"经查要用变量$gui=WinGetHandle("classname=TForm1", "")来替代。
桌面只是测试用吗 用你的句柄 高手就是写意,哈哈!
说的越多,菜的问题就越多,送佛送到西,每个都这样,后来就惜言如金了(跟帖的情况);另一个极端是详篇大论、普及推广开专题贴。
现在是多帮少说的策略,悟性能跟进的就其情况再点一句,解答过后仍不知所云的,自生自灭好了(其实亦有高手二代、高手三代的类推情况,终有覆盖到菜级的解答),这是自然而然的选择,怪不得个个论坛都是如此! 当然说的少却不能反推是高手。 http://www.autoitx.com/forum.php?mod=viewthread&tid=7051&highlight
请大家移步到以上链接,回复贴有相关附件下载
我琢磨了一下
结合sxd 和netegg 的启发
ControlTreeView ( "title", "text", controlID, "command" [, option1 [, option2]] )
参数:
command---> The command to send to the control
option1--- > 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"
如此,就可知道怎么读取楼主提出的类似窗体的内容啦
为了大家看着容易明白,我写了一个"读取温度仪",遇上过这个问题的可以参考一下:
http://www.autoitx.com/images/default/attachimg.gif http://www.autoitx.com/attachment.php?aid=3602&k=3aebc21bb9ba266b5a7287a564772a34&t=1242318795&noupdate=yes&sid=1b13BJaURRTyytj4P6%2BCvRrqwjAFosxZHqILJU4GQxZzBFs
[*]#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 如果需要全部数据取出来加个if..then..递归就可以了
页:
[1]
2