C# 当文本元素滚动到第一行之外时,Metro应用程序的UI自动化出现错误
我正在尝试使用以下代码提取鼠标下的文本C# 当文本元素滚动到第一行之外时,Metro应用程序的UI自动化出现错误,c#,microsoft-metro,microsoft-ui-automation,C#,Microsoft Metro,Microsoft Ui Automation,我正在尝试使用以下代码提取鼠标下的文本 private static async Task<string> getText(double x, double y) { try { var location = new System.Windows.Point(x, y); AutomationElement element = AutomationElement.FromPoint(location); object
private static async Task<string> getText(double x, double y)
{
try
{
var location = new System.Windows.Point(x, y);
AutomationElement element = AutomationElement.FromPoint(location);
object patternObj;
if (element.TryGetCurrentPattern(TextPattern.Pattern, out patternObj))
{
var textPattern = (TextPattern)patternObj;
var range = textPattern.RangeFromPoint(location);
range.ExpandToEnclosingUnit(TextUnit.Word);
var text = range.GetText(-1).Trim();
range.ExpandToEnclosingUnit(TextUnit.Line);
text += " [" + range.GetText(-1).Trim() + "]";
return text;
}
else if (element.TryGetCurrentPattern(ValuePattern.Pattern, out patternObj))
{
var valuePattern = (ValuePattern)patternObj;
return valuePattern.Current.Value;
}
else
{
var text = "";
var patterns = element.GetSupportedPatterns();
foreach (var pattern in patterns)
{
text += pattern.Id + " " + pattern.ProgrammaticName;
text += Environment.NewLine;
}
return text;
}
}
catch (Exception ex)
{
return ex.Message;
}
}
private静态异步任务getText(双x,双y)
{
尝试
{
var位置=新系统.Windows.Point(x,y);
AutomationElement元素=AutomationElement.FromPoint(位置);
对象模式OBJ;
if(element.TryGetCurrentPattern(TextPattern.Pattern,out patternObj))
{
var textPattern=(textPattern)patternObj;
变量范围=textPattern.RangeFromPoint(位置);
range.ExpandToEnclosingUnit(TextUnit.Word);
var text=range.GetText(-1.Trim();
range.ExpandToEnclosingUnit(TextUnit.Line);
text+=“[”+range.GetText(-1.Trim()+“]”;
返回文本;
}
else if(element.TryGetCurrentPattern(ValuePattern.Pattern,out patternObj))
{
var valuePattern=(valuePattern)patternObj;
返回值pattern.Current.Value;
}
其他的
{
var text=“”;
var patterns=element.GetSupportedPatterns();
foreach(模式中的var模式)
{
text+=pattern.Id+“”+pattern.ProgrammaticName;
text+=Environment.NewLine;
}
返回文本;
}
}
捕获(例外情况除外)
{
返回ex.消息;
}
}
这正常工作(使用Money Metro应用程序进行测试)。但是,如果文本框滚动到第一行之外,UI自动化会开始提取错误的文本,因为它认为窗口的顶部就是文本的顶部。例如,对于下图,鼠标处于“递增”状态,文本顶部(以“多数…”开头)可见
如果我们滚动过第一行,并再次将鼠标置于“增加”位置,这一次它会感到困惑,并从上面的行拖动。随着我们滚动越来越多,位移变得越来越大。在下图中,它从上面的行中拾取“with”
任何解决方法的想法也非常感谢
更新。本例中的“类”是RichTextBlock。Windows应用商店中的TextBlock中存在相同问题。似乎是RangeFromPoint不考虑滚动超过第一行的问题