通过UI自动化清除RichTextBox文本?

问题描述 投票:4回答:2

在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包装器提供的窗口句柄上找不到任何子窗口。

c# .net wpf vb.net ui-automation
2个回答
1
投票

不幸的是,我不相信在已经只读的字段中影响别人程序的任何版本都会很容易。但是,让我向您提出一些可以帮助您获得创意果汁的想法。

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

  • 封装应用程序!从您控制的应用程序运行它,获取Windows句柄可能会容易得多。然后继续你以前的计划。为应用程序提供不同的父级可以更改事物的层次结构并使WIN API正常工作以查找句柄
  • 反编译和重新编译。 .NET反编译得相当干净,并得到很好的支持。临时解决方案,但相当快速和直接。
  • 在他回应之前,开发人员一定要修复,如果你付钱,我打赌他会看到电子邮件。
  • 黑客记忆管理就像一个美丽的头脑程序员。可能是一个永久的解决方案,但非常困难
  • 这是我过多地阅读你的问题,听起来这个应用程序在某处附加数据。是否可以将时间戳附加到它附加的数据上,并创建一个单独的应用程序来管理该数据源?
  • 在减速无关紧要的环境中运行程序。如果应用程序是供客户端使用,这无济于事,但如果它在办公室可能只是最直接的选择。

不幸的是,从声音编程的角度来看,我只能建议反编译.NET程序集并重新编译。虽然这听起来并不可怕! .NET程序集反编译得非常好!我推荐Resharper DotPeek和ILSpy!

ILSpy方便,免费,直接并完成工作。但是没有内置的重新启动。您需要导出反编译的项目并自行编译或使用其他IDE编译。

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


0
投票

我想你正在寻找这个(snoopwpf

Snoop是Pete Blois在微软工作时创建的开源WPF间谍工具,现在由我自己维护Cory Plotts。随着时间的推移,一些人增加了贡献,最着名的是:Dan Hanan,Andrei Kashcha,Maciek Rakowski,Bailey Ling和Bastian Schmidt。

它允许您间谍/浏览正在运行的应用程序的可视树(无需调试器)......并更改属性......等等。

© www.soinside.com 2019 - 2024. All rights reserved.