【问题标题】:Clear RichTextBox text through UI Automation?通过 UI 自动化清除 RichTextBox 文本?
【发布时间】:2019-09-06 18:20:57
【问题描述】:

在 C# 或 VB.NET 中,我想清除驻留在外部 WPF 应用程序中的只读 RichTextBox 控件的整个文本。该控件支持文本模式,但不支持值模式。

目标是防止此控件附加数千个新文本行,因为最后我注意到当有很多很多文本行时,它会对应用程序的性能产生负面影响。

出于这个原因,或者,中断控件重绘(如果这对 WPF 有任何意义的话,对不起,我来自 WinForms),或者欺骗最大字符限制,也可以(或者我认为所以)。


我进行了调查,但我不知道如何才能做到这一点,因为我认为该控件不提供 Win32 窗口句柄,或者至少该元素的 AutomationElementInformation.NativeWindowHandle 属性为零,并且 Microsoft's UI Inspect 应用程序只给了我主窗口的 win32 窗口句柄,如本报告所示:

How found:  Mouse move (1623,896)
    hwnd=0x00000000009A0AFA 32bit class="HwndWrapper[processname.exe;;8b374e83-68a0-46c8-aa8b-c6792d5ff59e]" style=0x16CF0000 ex=0x4Name:   ""
ControlType:    UIA_DocumentControlTypeId (0xC36E)
LocalizedControlType:   "document"
AutomationId:   "rtbLog"
ClassName:  "RichTextBox"
IsControlElement:   true
IsContentElement:   true
IsTextEditPatternAvailable: false
IsTextPatternAvailable: true
IsTextPattern2Available:    false
IsValuePatternAvailable:    false
...

...Win32 API 枚举窗口的典型函数在 hWnd 包装器提供的窗口句柄上找不到任何子窗口。

【问题讨论】:

  • 主要问题是该控件是只读的。您可以使用 UI 自动化轻松获取 RTB(您已经拥有 AutomationId,因此少了一步)。但是,如果控件是只读的,我真的不知道如何设置/清除 WPF RTB 公开的 FlowDocument 文本。即使没有 ValuePattern,您也可以使用 TextPattern(或 TextPattern.DocumentRange),选择所有文本和 SendKeys.Send("");(因为它也不支持编程选择删除,IIRC)。我会考虑的。
  • @Jimi 感谢您对第一条评论的兴趣。第二,我觉得格格不入(好像是嘲讽);我有一些在 stackoverflow 社区中没有被问到的问题,因此从来没有回答过......例如,评论似乎有点复杂(如果可以做到的话),这对训练程序员的大脑总是有好处的。我会尝试使用文本模式。感谢您的评论。
  • 您是否拥有自动化 WPF 应用程序源代码?
  • @Simon Mourier 不,我不是想要自动化的 WPF 应用程序的所有者。
  • 您是否考虑与他们联系以获得有关此问题的支持?唯一的另一种方法是找到代码调用 write 函数的汇编程序调用,然后将其跳转到代码流中的下一个点(基本上绕过调用),并希望其他一些功能不会在此过程中被破坏.

标签: c# .net wpf vb.net ui-automation


【解决方案1】:

我想你正在寻找这个 (snoopwpf)

Snoop 是 Pete Blois 创建的开源 WPF 间谍实用程序 他受雇于微软,现在由我自己维护 Cory Plotts。 随着时间的推移,有几个人添加了贡献,大多数 值得注意的是:Dan Hanan、Andrei Kashcha、Maciek Rakowski、Bailey Ling 和 巴斯蒂安·施密特。

它允许您窥探/浏览正在运行的应用程序的可视化树 (无需调试器)... 并更改属性 ... 除其他外。

【讨论】:

  • 我明白你的意思。好吧,该应用程序有很多错误,拖放功能实际上会使我在其上拖动它的任何 WPF 应用程序崩溃,所以我看不出它是否真的在其源代码中实现了任何工作/成功的功能来更改控件的属性。我的意思是,如果该应用程序不适合我并且看起来不稳定,那么我认为我不能依靠检查它的源代码来找到任何可能有助于实现我的目标的东西。感谢您的回答。
  • 它是open source,这就是为什么我首先发布了我的答案,以便您可以深入了解代码,无论如何欢迎您:)
  • 我认为你有一个很好的观点建议存储库,但是应用程序(来自 github 的编译版本)不适用于我尝试的任何 WPF 应用程序,当我尝试时每个 WPF 应用程序都会崩溃“窥探”它,知道了这一点,我无法获取源代码(顺便说一句,这是大/乏味的东西)并开始分析它以寻找我根本不知道的东西我必须搜索的东西在内部,我也无法尝试调试代码以使其在我的 PC 中运行以避免那些崩溃,因为与 UI 自动化相关的编程可能是作者的专长,但不是我的专长。
  • 很抱歉帮不了你。
  • @ElektroStudios:是否可以发布导致崩溃的异常详细信息?
【解决方案2】:

不幸的是,我认为在已经只读的字段中影响其他人的程序的任何版本都不会容易。但是,让我向您提出一些可以帮助您激发创意的想法。

在我看来,真正解决您的问题的唯一方法是:

  • 封装应用程序!从您控制的应用程序运行它并获得您的 Windows 句柄可能会容易得多。然后继续你之前的计划。为应用提供不同的父级可能会改变事物的层次结构并导致 WIN API 正常工作以查找句柄

  • 反编译并重新编译。 .NET 反编译得相当干净,并且得到很好的支持。临时解决方案,但相当快速和直接。

  • 在开发人员回复之前向开发人员提出修复问题,如果您为此付费,我敢打赌他会看到电子邮件。

  • 像一个聪明的程序员一样破解内存管理。可能是一个永久的解决方案,但非常困难

  • 这是我对你的问题的解读过多,听起来这个应用程序在某处附加了数据。是否可以将时间戳附加到它附加的数据并创建一个单独的应用程序来管理该数据源?

  • 在减速不明显的环境中运行程序。如果应用程序是供客户使用的,这无济于事,但如果它在办公室,这可能是最直接的选择。

不幸的是,从合理编程的角度来看,我只能建议反编译 .NET 程序集并重新编译。这并不像听起来那么可怕! .NET 程序集反编译得非常好! 我强烈推荐 Resharper DotPeek 和 ILSpy!

ILSpy 方便、免费、直接并且可以完成工作。但重新编译不是内置的。您需要导出反编译的项目并自己编译或使用其他 IDE。

Resharper 受到高度管理,更新良好,并且 iirc 包含一个用于在 IDE 中重新编译的选项。可能是一个有效的永久解决方案,因为如果没有其他可行的解决方案,反编译和重新编译解决方案将非常容易。

更新:

对于仍在寻找答案的任何人,有一个名为 FlaUI 的库。 它是一个已经封装好用于 .NET 应用程序的 .NET 自动化库。它建立在现有的 Windows.UIAutomation Native 框架之上。甚至可以启用一些基本 UIAutomation 框架中没有的东西。在这个和 FLAUIInspect 工具之间查看大多数窗口上的所有可用数据,我发现 UI 自动化在过去几个月中通过这些工具更加直接。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-05
    • 2021-08-14
    • 2012-08-21
    • 1970-01-01
    相关资源
    最近更新 更多