V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
elechi
V2EX  ›  程序员

如何定时获取某个桌面软件界面显示的数据?

  •  
  •   elechi · 2021-12-15 16:44:25 +08:00 · 2715 次点击
    这是一个创建于 1111 天前的主题,其中的信息可能已经有所发展或是发生改变。

    各位大佬们,现在有个需求,windows 平台,运行的一个带 GUI 的软件(用 MFC 或者 QT 开发的 GUI 软件),界面上显示的一些数据,现在想定时获取这个软件界面的数据,有什么好的办法吗? 我能想到的办法: 1.定时截屏,获取数据,但是这要求这个 GUI 软件必须处于前台显示中,如果最小化后就无法获得了。 2.捕获内存,类似于金山游侠的原理,直接找到数据在内存中的位置。 各位大佬还有没有其他的好办法,谢谢了。

    21 条回复    2021-12-16 13:40:02 +08:00
    strict
        1
    strict  
       2021-12-15 16:55:52 +08:00
    如果看不到源码的话, 只能采取第一种 RPA 的方式了. 业界也比较成熟了.
    abear
        2
    abear  
       2021-12-15 17:00:48 +08:00
    cheatEngine
    abear
        3
    abear  
       2021-12-15 17:02:24 +08:00
    wireshark
    crab
        4
    crab  
       2021-12-15 17:07:49 +08:00
    WinAppDriver
    orangie
        5
    orangie  
       2021-12-15 17:27:21 +08:00   ❤️ 2
    参考 obs 和其他的录屏软件,其实第一种窗口不必须在最前,可以被其他窗口遮盖,因为 Windows 桌面从 vista 开始就是多层合成的。但应该还是不能最小化,因为似乎应用程序会根据是否最小化决定是否绘制窗口。不过话说,用 MFC 或者 Qt 开发的程序,应该用的是系统自带的控件展示数据,那么应该可以 hook 得到那个控件对象的句柄,然后从中取得数据,不过这些我没实践过,只是听说过。
    elechi
        6
    elechi  
    OP
       2021-12-15 17:41:10 +08:00
    @abear wireshark 不是捕获网络数据的吗?
    elechi
        7
    elechi  
    OP
       2021-12-15 17:43:56 +08:00
    除了分析屏幕和内存还有没有其他的方式?
    siknet
        8
    siknet  
       2021-12-15 19:54:19 +08:00 via Android
    按键精灵取后台程序数据
    xtinput
        9
    xtinput  
       2021-12-15 20:02:41 +08:00
    开多桌面呀
    abear
        10
    abear  
       2021-12-15 23:18:11 +08:00
    一切的数据都有来源,大多数来源是 http ,桌面截图是程序外,cheatEngine 是内存里面找,wireshark 从数据来源上面找
    misdake
        11
    misdake  
       2021-12-16 00:06:04 +08:00
    MFC 或者 Qt 的话,可以抓到控件句柄,直接读数据的吧
    xupefei
        12
    xupefei  
       2021-12-16 00:18:40 +08:00 via iPhone
    最通用的方法是虚拟出一个假显示器,把窗口挪过去。
    这样你就不用管程序最小化后还会不会更新窗口了。
    ysc3839
        13
    ysc3839  
       2021-12-16 00:51:31 +08:00
    可能可以通过无障碍相关的接口读到界面的文本数据。具体得看是什么 GUI 框架,请提供详细信息一边判断。
    ysc3839
        14
    ysc3839  
       2021-12-16 00:51:43 +08:00
    @ysc3839 一边判断 -> 以便判断
    ysc3839
        15
    ysc3839  
       2021-12-16 00:56:10 +08:00
    @orangie 其实 Windows XP 时就可以获取后台窗口的画面,因为加入了 PrintWindow 这个 API 。不过这个方法不是绝对有效,程序可以选择不返回图像。
    ClericPy
        16
    ClericPy  
       2021-12-16 02:46:50 +08:00
    挺多软件貌似可以按控件句柄提取 TEXT 什么的, 以前玩 autohotkey 的时候那个 winspy 还是 ahkinfo 什么的就挺简单的. 不过得看用什么框架写的 GUI, 有的窗口就拿不到控件信息
    crazt
        17
    crazt  
       2021-12-16 03:45:32 +08:00
    可以试试微软的 Power Automate Desktop ,个人账户虽然能用但没法设置定时启动,如果弄一个开发者订阅或是企业订阅就可以定时执行你要的操作。用 UI 自动化里的功能获取数据后邮件自动发送就行,也可以用它类似按键精灵的功能操控鼠标键盘完成你的需求(比如发送或是打开窗口)。
    虽然我最近才发现这个软件,还没实际用过,但觉得楼主可以装一个试试 (¬‿¬)
    yousabuk
        18
    yousabuk  
       2021-12-16 07:47:20 +08:00 via iPhone
    可以用 C 获取 window 句柄,控件句柄,再读取值。

    其他不晓得
    ragnaroks
        19
    ragnaroks  
       2021-12-16 08:31:12 +08:00
    各种传奇开区助手,就是通过句柄取数据后台全自动操作具体的平台网关。

    其中 WPF 这类可以通过 MainWindow.Content[0].Content[0].Button.Caption 这种方式写死路径查找
    huruwo
        20
    huruwo  
       2021-12-16 10:44:21 +08:00
    抓包
    elechi
        21
    elechi  
    OP
       2021-12-16 13:40:02 +08:00
    感谢各位大佬的意见,我去试试
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1357 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 17:28 · PVG 01:28 · LAX 09:28 · JFK 12:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.