- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
该代码适用于 Word 和 Outlook,但不适用于 PowerPoint,因为只有文本框的第一个字符或第一个单词被选中。这是一个错误吗?有什么解决方法吗?在 PowerPoint 2013 中的简单 PowerPoint 幻灯片上试试这个。
private static async Task<string> getText(double x, double y)
{
string result = null;
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);
range.Select();
var text = range.GetText(-1).TrimEnd('\r');
return text.Trim();
}
else
{
return "no text found";
}
}
catch (Exception ex)
{
return ex.Message;
}
}
从截图上看不出来,但是鼠标是在“first”上而不是“stuck”,但是无论鼠标放在哪里,它总是卡住。也许这是在 PowerPoint 2016 中修复的?
当我查看范围的边界框时,它始终是整个元素,而不是所选单词。这可能是 RangeToPoint 无法正常工作的部分原因。
原文发表于MSDN但是没有反应...
更新。如果我使用
text = printRange(range, text);
while (range.Move(TextUnit.Word, 1) > 0)
{
text += Environment.NewLine;
text = printRange(range, text);
}
我明白了
最佳答案
此行为可能是由于 PowerPoint 2013 中的限制所致,我预计您无法使用 UIA 解决此问题。当您调用 RangeFromPoint() 时,UIA 提供程序点击鼠标下方(即实现 IUIAutomationTextPattern::RangeFromPoint() 的提供程序)旨在返回鼠标光标所在的退化(即空)范围。然后 UIA 客户端可以扩展返回的范围以获取周围的字符、单词、行或段落。
但是,正如您所指出的,PowerPoint 2013 并未这样做。我刚刚编写了下面的测试代码(使用由 tlbimp.exe 生成的 native Windows UIA API 的托管包装器),发现 PowerPoint 显然为光标下方的整个文本框返回了一个 TextRange。当我运行代码时,我发现我确实在写字板、Word 2013 和 PowerPoint OnLine 中得到了光标下方的预期单词,但在 PowerPoint 2013 中却没有。当我运行作为 Inspect SDK 一部分的文本资源管理器工具时,我得到了相同的结果工具。下图显示当鼠标悬停在其中一个单词上时,文本资源管理器报告从 PowerPoint 2013 返回的文本是文本框中的完整文本。
(我应该补充一点,下面的测试代码才能正常工作,我认为当前的显示缩放设置需要为 100%。我没有添加代码来说明其他一些缩放处于事件状态。)
我不知道 PowerPoint 2016 中是否已修复此问题,我会尝试调查并告知您。
谢谢,
家伙
private void buttonGetTheText_Click(object sender, EventArgs e)
{
labelText.Text = "No text found.";
IUIAutomation uiAutomation = new CUIAutomation8();
Point ptCursor = Cursor.Position;
tagPOINT pt;
pt.x = ptCursor.X;
pt.y = ptCursor.Y;
// Cache the Text pattern that's available through the element beneath
// the mouse cursor, (if the Text pattern's supported by the element,) in
// order to avoid another cross-process call to get the pattern later.
int patternIdText = 10014; // UIA_TextPatternId
IUIAutomationCacheRequest cacheRequestTextPattern =
uiAutomation.CreateCacheRequest();
cacheRequestTextPattern.AddPattern(patternIdText);
// Now get the element beneath the mouse.
IUIAutomationElement element =
uiAutomation.ElementFromPointBuildCache(pt, cacheRequestTextPattern);
// Does the element support the Text pattern?
IUIAutomationTextPattern textPattern =
element.GetCachedPattern(patternIdText);
if (textPattern != null)
{
// Now get the degenerative TextRange where the mouse is.
IUIAutomationTextRange range = textPattern.RangeFromPoint(pt);
if (range != null)
{
// Expand the range to include the word surrounding
// the point where the mouse is.
range.ExpandToEnclosingUnit(TextUnit.TextUnit_Word);
// Show the word in the test app.
labelText.Text = "Text is: \"" + range.GetText(256) + "\"";
}
}
}
关于c# - 当我尝试对 PowerPoint 2013 使用 UI 自动化时,我只能在使用 RangeFromPoint 时获取第一个字符/单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32540442/
有一条(相对)众所周知的 Perl 公理:“只有 Perl 可以解析 Perl”。我想知道 Perl 6 是否仍然如此? 扩大讨论...考虑到 PyPy 最近的更新,我想到了这个问题。 Perl 独特
这是设置。在上一个问题中,我发现我可以通过子组件中的状态传递对象属性,然后使用 componentDidUpdate 获取该对象属性。在这种情况下,状态和属性都称为到达。 这是基本代码... expo
我运行的是 10.5.2 社区版。我已经标记了 源/主要/资源 作为源目录。我可以右键单击并“编译”某些文件,据我所知,这意味着 IDE 将文件复制到与发送类文件的“com.mydomain.pack
我是一名优秀的程序员,十分优秀!