las6040 发表于 2024-12-1 13:07:47

求助!pywinauto获取CVirtualGridCtrl(虚拟网格)内容

在编写“同花顺”自动交易时,需要获取实时股票信息,在“专业版下单”窗口

用inspect显示这个窗格的类名(classname):CVirtualGridCtrl

利用pywinauto的.print_control_identifiers()方法,打印出了子控件列表,其中涉及pane(CVirtualGridCtrl)的内容如下

Pane - 'HexinScrollWnd'    (L132, T362, R1411, B544)
   | ['Pane', 'HexinScrollWndPane', 'HexinScrollWnd', 'Pane0', 'Pane1', 'HexinScrollWndPane0', 'HexinScrollWndPane1', 'HexinScrollWnd0', 'HexinScrollWnd1']
   | child_window(title="HexinScrollWnd", auto_id="12004", control_type="Pane") #股票信息显示框(大框)
   |    |
   |    | Pane - 'HexinScrollWnd2'    (L132, T362, R1411, B544)
   |    | ['HexinScrollWnd2Pane', 'HexinScrollWnd2', 'Pane2', 'HexinScrollWnd2Pane0', 'HexinScrollWnd2Pane1', 'HexinScrollWnd20', 'HexinScrollWnd21']
   |    | child_window(title="HexinScrollWnd2", auto_id="200", control_type="Pane")
   |    |    |
   |    |    | Pane - 'Custom2'    (L132, T362, R1411, B544)
   |    |    | ['Custom2', 'Pane3', 'Custom2Pane', 'Custom20', 'Custom21', 'Custom2Pane0', 'Custom2Pane1']
   |    |    | child_window(title="Custom2", auto_id="12004", control_type="Pane")

pywinauto无法发现Custom2的子控件,因此无法使用window_text()方法获取子控件的字符


CSDN的方法是采用Ctrl+C的方法:
CVirtualGridCtrl控件是同花顺自己写的控件和网上的不同,难处理,可以通过
模拟输入ctrl+c,然后从clipboard提取内容。
然而,同花顺显然想到了,当多次ctrl+c时会弹出验证码界面
请求大佬帮忙,谢谢!!

FishC 发表于 2024-12-1 13:14:42

获取CVirtualGridCtrl(虚拟网格)中的内容确实是一个棘手的问题,特别是当应用程序阻止常规的Ctrl+C操作时。以下是几个可能的解决方法:

1. **OCR识别**:
   - 利用截图结合OCR(Optical Character Recognition,光学字符识别)的方法。可以使用Python中的`pytesseract`库,但这种方法对准确性和速度有些要求,可能需要调整一些参数。

2. **UI Automation工具**:
   - 使用像`UIA`(UI Automation)库来访问控件的底层信息,这是一个操作系统级别的API,可能能够获取pywinauto无法处理的控件信息。

3. **切换思路**:
   - 检查是否有其他途径获取数据,例如查找API接口。同花顺可能会有支持API的版本,或者通过其他办法获取到后台数据。

4. **模拟人工操作**:
   - 如果可以的话,不是频繁操作,只是单次获取的话,可以通过模拟人工的方式,点击右键查看能否有复制的选项。

如果以上建议没有帮助,可能需要结合特殊的界面分析软件或者深入了解此控件的详细行为特性才能更好解决该问题。希望对你有所帮助,如果尝试了其他方案成功,请分享你的经验!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

las6040 发表于 2024-12-1 13:24:22

FishC 发表于 2024-12-1 13:14
获取CVirtualGridCtrl(虚拟网格)中的内容确实是一个棘手的问题,特别是当应用程序阻止常规的Ctrl+C操作时 ...

用pytesseract试过,确实如您所说,准确性无法保证,尤其是不能准确判断数值的正负,对后续的运算逻辑造成严重影响,因此放弃了!
不知道UI Automation工具是否有python api?
右键点击“复制”,“另存”都试过了,同样的限制,多次高频率操作必然会触发验证码

FishC 发表于 2024-12-1 13:24:37

las6040 发表于 2024-12-01 13:24
用pytesseract试过,确实入您所说,准确性无法保证, ...

UI Automation工具确实可以通过Python访问,通常使用`pywinauto`的高级功能`UIA`支持,但这可能仍然无法完全解决问题,因为这是操作系统级别的接口,仍可能受限于某些定制控件。

下面是一个简单使用UIA的方法:

from pywinauto import Application
app = Application(backend="uia").connect(path='your_application_path.exe')
main_window = app.window(title='your_window_title')
# 接下来就需要找出各个控件的详细路径

1. **Pywinauto UIA**:
   - 使用pywinauto的UIA支持。这是一个更深入的功能,可能会有更好的成功率去抓取内容。

2. **其他工具支持**:
   - 可以尝试使用`pyGetWindow`、`pyWinGui`等工具包,或者尝试第三方库例如`pyAutoGUI`用于高级模拟控制。

3. **其他API**:
   - 寻找第三方接口或数据服务商提供的API获取股票数据。虽然可能有成本,但是能够稳定获取所需数据。

在你的用例中特别重要的是避免过于频繁的请求以触发保护机制,所以无论使用何种方法都要考虑到整体解决方案的稳定性和可行性。希望能在这一过程中找到符合你需求的解决方案。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

las6040 发表于 2024-12-1 13:26:49

FishC 发表于 2024-12-1 13:24
UI Automation工具确实可以通过Python访问,通常使用`pywinauto`的高级功能`UIA`支持,但这可能仍然无 ...

是的,但这可能仍然无法完全解决问题,因为这是操作系统级别的接口,仍可能受限于某些定制控件。

FishC 发表于 2024-12-1 13:26:55

las6040 发表于 2024-12-01 13:26


如果您还有需要进一步探讨或其他问题,随时可以提问。希望之前的建议能帮到您,解决在自动化操作中的难题!如果找到了解决方案,分享出来也能帮助到其他遇到相同问题的朋友。祝您好运!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

las6040 发表于 2024-12-1 13:28:07

FishC 发表于 2024-12-1 13:26
如果您还有需要进一步探讨或其他问题,随时可以提问。希望之前的建议能帮到您,解决在自动化操作中的难 ...

现在鱼C都是AI在回答了吗?

FishC 发表于 2024-12-1 13:28:14

las6040 发表于 2024-12-01 13:28
现在鱼C都是AI在回答了吗?

目前,鱼C为了提高解答效率和覆盖率,部分问题可能会由AI辅助进行初步的解答。不过,鱼C社区一直以来都有大量热心的专业人士参与,他们会针对具体问题提供专业的意见和指导。因此,无论是AI还是社区的专家,都会尽力帮助大家解决问题。您的反馈和经验分享也非常重要,我们随时欢迎!如果有任何问题或建议,欢迎继续与我们沟通。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

小甲鱼的二师兄 发表于 2024-12-1 15:01:18

las6040 发表于 2024-12-1 13:28
现在鱼C都是AI在回答了吗?

主要是你这个问题我也没遇到过呀,不知道怎么帮哈哈哈哈

las6040 发表于 2024-12-1 15:16:14

小甲鱼的二师兄 发表于 2024-12-1 15:01
主要是你这个问题我也没遇到过呀,不知道怎么帮哈哈哈哈

貌似无解,stack overflow上只有一条提问,回复也是Ctrl+C的解决方案

小甲鱼的二师兄 发表于 2024-12-1 17:30:52

如果只是需要获取股票信息的话,可以考虑从其他途径入手。

小甲鱼的二师兄 发表于 2024-12-1 17:31:19

像 tushare 的 API 就不错呀

las6040 发表于 2024-12-1 17:47:27

本帖最后由 las6040 于 2024-12-1 18:01 编辑

小甲鱼的二师兄 发表于 2024-12-1 17:31
像 tushare 的 API 就不错呀

tushare,akshare都是通过券商或者是专业网站的开放接口获取的实时数据,需要担心的是:由于自动交易需要高频调用这些开放接口数据,因此,怕这些开放接口有可能会失效,原本我是希望获得类似websocket协议,自动刷新数据的,本着白嫖的原则,想起了读取同花顺交易界面的实时数据,其实easytrade库(easyquotation的子库)也有自动交易api,查看它的代码,发现也是采用了pywinauto实现的,只不过easytrade是6年前更新的,之后一直未更新,要想使用它的自动交易api只能下载同花顺早期的交易界面,因此想着自己写一个,没想到卡住了。。。。{:5_104:}

las6040 发表于 2024-12-1 17:55:22

小甲鱼的二师兄 发表于 2024-12-1 17:31
像 tushare 的 API 就不错呀

另外,最主要的,是我需要根据持仓情况决定自动交易策略,这也是必须获取交易界面实时数据,绕不开。。。。{:5_90:}
页: [1]
查看完整版本: 求助!pywinauto获取CVirtualGridCtrl(虚拟网格)内容