【问题标题】:Remote Window doesn't receive message远程窗口没有收到消息
【发布时间】:2016-06-12 08:43:15
【问题描述】:

我正在尝试对其他程序(A 和 B)中的 TreeView 使用相同的代码(程序 C)调用 TreeView_GetRoot(TVM_GETNEXTITEM 消息)以操纵它们。

程序A可以接收到消息(我可以看到来自spy++的消息)。

但是对于程序B,似乎它无法接收到消息,从VC调试窗口返回值是'undefined',同时spy++中没有消息显示。 (Spy++ 正确显示消息以手动单击 TreeView)

这两个程序和 spy++ 都是 32 位的。

此外,Winspector(如 spy++)可以显示程序 A 中 TreeView 的项目数,但不能显示程序 B 中的项目数。我怀疑这是由相同的原因引起的。

你知道有什么可能吗?

【问题讨论】:

  • 哪个程序在发送消息?程序A?还是完全不同的程序?
  • @CodyGray 一个不同的程序。假设它是 C。
  • 那么 IInspectable 已经有了你的答案。 GetLastError 说什么? 5 == 访问被拒绝,因为它被 UIPI 阻止。

标签: windows winapi visual-c++ sendmessage


【解决方案1】:

SendMessage 的文档说明,消息发送受 UIPI 约束(参见Windows Integrity Mechanism Design):

消息发送受 UIPI 约束。进程的线程只能向完整性级别较低或相等的进程中的线程的消息队列发送消息。

文档还说明了如何报告因违反 UIPI 引起的错误:

当一条消息被 UIPI 阻止时,使用 GetLastError 检索到的最后一个错误设置为 5(拒绝访问)。

以下列出了可能的解决方案:

  • 使用UI Automation。在某些情况下,UI 自动化程序可以绕过 UIPI 限制。
  • 以更高的完整性级别运行控制应用程序。不建议这样做,仅应将其视为最后的手段。

【讨论】:

  • UI 自动化是否需要修改目标程序(B 和 C)?它们不在我的控制之下。
  • @user1633272:UI 自动化要求目标程序公开所需的接口。对于所有标准 Windows 控件以及几个框架(自然是 MFC,因为它包装了标准控件、Qt 等)都是如此。要调查特定程序是否公开了必要的接口,请使用Inspect tool 进行查找。
  • 我可以从 Inspect.exe 中看到控件及其值。我认为这可以通过 UI 自动化来完成。非常感谢。
  • TreeWalker.GetFirstChild 为程序 A 返回对象,但为程序 B 返回 null。有什么建议吗?
  • @user1633272:您是否阅读过document I linked to in my answer 中解释的要求?特别是,您的应用程序是否“具有可以使用数字证书进行验证的数字签名,该数字证书链接到本地​​计算机受信任的根证书颁发机构证书存储中的受信任的根”
猜你喜欢
  • 2020-11-15
  • 2021-01-29
  • 2012-06-30
  • 1970-01-01
  • 2020-10-22
  • 2016-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多