【发布时间】: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