我有一个 Windows 应用程序(Windows 窗体应用程序)。我需要运行自动化来获取当前窗口中的所有文本,包括窗口图块,以及窗口内所有元素的所有文本。
我尝试使用 SendMessage 和 GetWindowText,它只返回窗口图块,但我也需要获取窗口内的文本。
有没有一种方法可以抓取窗口中的所有文本?
还是我需要遍历所有元素并获取文本?怎么做?
提前致谢。
有没有一种方法可以抓取窗口中的所有文本?
不,或者更确切地说“不知道文本是如何呈现的”。
如果窗口包含其他控件(例如标签),那么您需要枚举这些控件并获取它们的文本。
如果文本被直接绘制到窗口的表面(例如在WM_PAINT
处理程序中),那么它只是一个正在显示的位图(文本已丢失),如果没有提供任何内容,则没有简单的方法来恢复它应用程序(OCR 是另一种选择)。
您将不得不遍历表单上的所有元素并分别获取它们的文本值。
此递归函数将返回您指定的控件及其所有子控件的所有文本值的字符串列表。
private List<string> getStrings(Control control)
{
List<string> retval = new List<string>();
if (control.Text != "")
retval.Add(control.Text);
foreach (Control child in control.Controls)
retval.AddRange(getStrings(child));
return retval;
}
所以如果你从你的主窗体中调用它,你会这样称呼它:
List<string> allStrings = getStrings(this);
请注意,此函数仅返回窗体上所有控件的文本值,并递归地跟随它们的子控件。例如,某些控件(如 ListBox)可能有一个完整的文本值列表,此函数不会返回这些值。为此,您可能必须稍微扩展该函数以测试控件的类型并在适用时专门返回其内容。