【问题标题】:How to read QTextEdit content from another application?如何从另一个应用程序读取 QTextEdit 内容?
【发布时间】:2015-06-05 05:47:36
【问题描述】:

我目前正在尝试制作一个调试工具,它将位于专有应用程序(通过 BLE 与硬件接口)之上。

在这个应用程序内部(用 QT 编写)有一个文本框,其中包含来自硬件的日志信息流,我想制作一个应用程序来监控该文本框并处理正在记录的数据。

我打开 Spy++ 并找到了我需要的窗口句柄,但是,它只显示为“QWidget”,并且 WM_GETTEXT 没有提取任何数据。这两个链接还提到标准 Win32 API 无法读取 QT 小部件(这对我来说感觉很奇怪,因为我确信所有东西都需要通过 Windows GUI 层): https://forum.qt.io/topic/36867/accessing-qtextedit-from-another-program/9 https://forum.qt.io/topic/19256/how-get-handle-of-qwidget-child-with-vb-net/9

我愿意接受任何和所有选择!我对这个语言不可知论者。如何读出 QTextEdit 的日志数据?

【问题讨论】:

  • Err... 我不知道您为什么希望能够通过访问其窗口句柄来从由任意代码实现的 Qt Widget 中读取数据。您可能会查看Sikuli“Sikuli 自动执行您在屏幕上看到的任何内容。它使用图像识别来识别和控制 GUI 组件。当无法轻松访问 GUI 的内部或源代码时,它很有用。” (但我认为与代码的开发人员交谈以提供某种钩子也是值得的,而不是花费大量开发时间以不稳定的方式完成此类任务......!)
  • 看看这个工具-github.com/KDAB/GammaRay

标签: c# c++ qt winapi spy++


【解决方案1】:

Qt 的小部件支持辅助技术 (AT) 开箱即用。在 Windows 上,Qt 的Accessibility 可通过MSAAIAccessible2 获得。任何一个都能够检查小部件树,并跨进程边界传递小部件的属性。

Qt 正式支持任一接口。

【讨论】:

  • 我以前见过一两次提到 MSAA,但我还没有看到任何将它用于此目的的例子。我会深入研究一下。我假设有一些基于此的 UI 自动化系统。
【解决方案2】:

您无法读取 QTextEdit 的内容,因为它是一个外星小部件。您可以在QWidget 文档中阅读更多内容:

在 Qt 4.4 中引入,外星小部件是未知的小部件 窗口系统。它们没有关联的本机窗口句柄 跟他们。此功能显着加快了小部件的绘制速度, 调整大小,并消除闪烁。

如果您需要原生窗口的旧行为,您可以 选择以下选项之一:

  1. 在您的环境中使用 QT_USE_NATIVE_WINDOWS=1。

  2. 在您的应用程序上设置 Qt::AA_NativeWindows 属性。全部 小部件将是本机小部件。

  3. 在小部件上设置 Qt::WA_NativeWindow 属性:小部件本身 它的所有祖先都将成为本地人(除非 Qt::WA_DontCreateNativeAncestors 已设置)。

  4. 调用 QWidget::winId 以强制使用原生窗口(这意味着 3)。

  5. 设置 Qt::WA_PaintOnScreen 属性以强制使用本机窗口 (这意味着 3)。


还有一个可能对您有用的 Qt 内省工具:GammaRay。就我个人而言,我没有使用它 - 只阅读了一个简短的概述,但它看起来很有希望。

【讨论】:

  • 对于小部件由本机窗口支持以使其可以从另一个进程访问,没有特别的要求。它只需要实现启用UI Automation所需的接口即可。 Qt 顺便为它的所有小部件做了什么,无论是否是外来的。
  • @IInspectable,Set the Qt::AA_NativeWindows attribute on your application. All widgets will be native widgets 不是很清楚地表明,如果设置了属性,所有小部件都应该是原生的吗?也许并非所有小部件都由本机控件(现实)支持,但据我了解,文档指出它们是(理论)。
  • 您无需回退到旧版实施。正如我之前的评论和answer 所指出的,OP 所需的一切都已经可用。
  • @ixSci 首先,像您提议的更改具有很强的侵入性,开发人员可能不想这样做,这是有充分理由的。或者提问者甚至无法控制应用程序进行更改。但真正的一点是,用窗口句柄破解并不是执行自动化的方法。小部件完全没有理由被窗口化,并且当时的主要 UI 框架使用非窗口小部件。因此,请按照自然预期使用平台自动化设施。
  • @DavidHeffernan,我没有说它好,也没有提议使用它。我只是回答了为什么基于 Qt 的应用程序不是 Spyable 的问题。是否存在回退到本机小部件的可能性,对我而言,了解它是件好事。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-26
  • 1970-01-01
  • 2017-11-10
  • 2013-11-07
  • 1970-01-01
  • 2014-02-05
相关资源
最近更新 更多