【问题标题】:Why does a Qt application only create window handles if Spy++ is running?如果 Spy++ 正在运行,为什么 Qt 应用程序只创建窗口句柄?
【发布时间】:2020-10-26 13:44:01
【问题描述】:

我正在尝试自动化一个旧的 Qt 4 应用程序(我没有它的源代码)。如果我在运行 Spy++ 之前运行应用程序之前,Qt 不会为子小部件创建窗口句柄。如果我在 Spy++ 之后运行应用程序,则会为按钮等子小部件创建窗口句柄,我可以使用FindWindow 找到它们。

Spy++ 做了什么来让 Qt 创建子窗口句柄,我如何在我自己的程序中做到这一点?

【问题讨论】:

  • 试试Wincheat。这是一种 Spy++ 类固醇。
  • 回复。强制在您自己的程序中创建本机窗口,请参阅Native Widgets vs Alien Widgets
  • 如果您想自动化 UI,请使用 UI Automation。您很快就会发现,您提出的问题与您要解决的问题没有技术相关性。
  • @IInspectable 您的评论与我的问题无关。
  • @IInspectable 我在问为什么 Qt 仅在 Spy++ 运行时才为小部件创建窗口句柄。我不是在征求你对为什么我需要知道这一点的意见。

标签: c windows qt winapi


【解决方案1】:

更新: 刚刚看到 @G.M. 提供了一个文档链接,该链接也回答了这个问题。)

经过一番搜索,我认为我知道为什么会发生这种情况。

它发生了,因为你这样做了;-)

Spy++ 显然向应用程序发送 WM_GETOBJECT 窗口消息,就像 Microsoft Active Accessiblity 一样。

Qt 对 intercept those messagesadjust 足够智能,即不使用外来小部件,而是使用本地小部件 - 因为 Windows 可访问性机制看不到轻量级/外来小部件。 (显然,@IInspectable 的评论指出这是一个错误的假设;谢谢)

换句话说,您不能使用 Spy++ 来查看带有 Qt 的非本地小部件。 逻辑是双向的:你不能这样做,因为 Spy++ 导致 Qt 使用本机小部件;即使没有(Qt 没有 WM_GETOBJECT 处理),您也不会看到任何 Qt 小部件的子窗口,因为不会有任何(原生的)。

【讨论】:

  • 优秀。我认为 Spy++ 正在做一些事情来触发 Qt 中的可访问性 API,但找不到它是什么。谢谢!
  • MSAA/UIA 不依赖本机窗口句柄。它纯粹在可访问树提供的接口上运行。这不像 Edge 或 Firefox 会突然切换模式并突然为他们的无窗口 UI 发明原生窗口只是为了变得可访问。通过实现可访问的接口,它们是可访问的。这个答案可能会解决所提出的问题,尽管提供的理由不符合目标。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-20
  • 1970-01-01
  • 2011-10-17
  • 1970-01-01
相关资源
最近更新 更多