当我尝试使用 UI Automation for PowerPoint 2013 时,我只能在使用 RangeFromPoint 时获取第一个字符/单词

2023-11-27

该代码适用于 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;
    }
}

从截图中看不出来,但鼠标是在“第一”而不是“卡住”,但无论鼠标放在哪里,它总是卡住。也许这在 PowerPoint 2016 中已修复?

enter image description here

当我查看范围的边界框时,它始终是整个元素,而不是选定的单词。这可能是 RangeToPoint 不起作用的部分原因。

原文发表于MSDN但没有回应...

Update.如果我使用

text = printRange(range, text);
while (range.Move(TextUnit.Word, 1) > 0)
{
    text += Environment.NewLine;
    text = printRange(range, text);
}

I get

enter image description here


此行为可能是由于 PowerPoint 2013 中的限制造成的,我预计您无法使用 UIA 解决此问题。当您调用 RangeFromPoint() 时,UIA 提供程序点击鼠标下方(即实现 IUIAutomationTextPattern::RangeFromPoint() 的提供程序),旨在返回鼠标光标所在的退化(即空)范围。然后UIA客户端可以扩展返回的范围以获得周围的字符、单词、行或段落。

但是,正如您所指出的,PowerPoint 2013 并没有这样做。我刚刚编写了下面的测试代码(使用 tlbimp.exe 生成的本机 Windows UIA API 的托管包装器),并发现 PowerPoint 显然为光标下方的整个文本框返回了 TextRange。当我运行代码时,我发现在写字板、Word 2013 和 PowerPoint OnLine 中确实在光标下方得到了预期的单词,但在 PowerPoint 2013 中却没有。当我运行作为 Inspect SDK 一部分的文本资源管理器工具时,我得到了相同的结果工具。下图显示了当鼠标悬停在其中一个单词上时,文本资源管理器报告从 PowerPoint 2013 返回的文本是文本框中的整个文本。

(我应该补充一点,为了让下面的测试代码完全正常工作,我认为当前的显示缩放设置需要为 100%。我没有添加代码来说明其他一些缩放处于活动状态。)

我不知道 PowerPoint 2016 中是否已修复此问题,我会尝试调查并通知您。

Thanks,

Guy

enter image description here

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) + "\"";
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当我尝试使用 UI Automation for PowerPoint 2013 时,我只能在使用 RangeFromPoint 时获取第一个字符/单词 的相关文章

  • 如何在 C++ 中的文件末尾添加数据?

    我已按照网上的说明进行操作 此代码应该将输入添加到文件 数据库 的末尾 但当我检查时 数据会覆盖现有数据 请帮忙 这是我的代码 int main string name string address string handphone cou
  • 为 Visual Studio 2013 编译 Tesseract

    我正在尝试使用tesseract在 Visual Studio 2013 中 我在链接器 gt 输入 不是 libtesseract302 static lib 中使用 libtesseract302 lib 一切都正常 并且已编译并运行
  • 如何将 #ifdef DEBUG 添加到 Xcode?

    我的项目中有一些代码永远不应该在发布版本中使用 但在测试时很有用 我想做这样的事情 ifdef DEBUG Run my debugging only code endif 在 Xcode 4 中哪里添加 DEBUG 设置 我尝试将其放入
  • 检测设备方向

    我需要检测 Android 设备方向变化 而无需手动处理传感器数据 同时保持活动方向坚持某个方向 onConfigurationChange不会起作用 因为会让我的活动不旋转 通过使用传感器数据来检测方向变化 我认为这是轮子的发明 因为 A
  • 单元测试一起运行时失败,单独运行时通过

    所以我的单元测试遇到了一些问题 我不能只是将它们复制并粘贴到这里 但我会尽力而为 问题似乎是 如果我一项一项地运行测试 一切都会按预期进行 但如果我告诉它一起运行测试 则 1 5 将通过 TestMethod public void Obj
  • 将 System.Windows.Input.KeyEventArgs 键转换为 char

    我需要将事件参数作为char 但是当我尝试转换 Key 枚举时 我得到的字母和符号与传入的字母和符号完全不同 如何正确地将密钥转换为字符 这是我尝试过的 ObserveKeyStroke this new ObervableKeyStrok
  • 存储来自其他程序的事件

    我想将其他应用程序的事件存储在我自己的应用程序中 事件示例 打开 最小化 Word 或打开文件时 这样的事可能吗 运行程序 http msdn microsoft com en us library ms813609 aspx and 打开
  • 单击 form2 上的按钮触发 form 1 中的方法

    我对 Windows 窗体很陌生 我想知道是否可以通过单击表单 2 中的按钮来触发表单 1 中的方法 我的表格 1 有一个组合框 我的 Form 2 有一个 保存 按钮 我想要实现的是 当用户单击表单 2 中的 保存 时 我需要检查表单 1
  • 未定义的行为或误报

    我 基本上 在野外遇到过以下情况 x x 5 显然 它可以在早期版本的 gcc 下编译干净 在 gcc 4 5 1 下生成警告 据我所知 警告是由 Wsequence point 生成的 所以我的问题是 这是否违反了标准中关于在序列点之间操
  • Visual Studio 中的测试单独成功,但一组失败

    当我在 Visual Studio 中单独运行测试时 它们都顺利通过 然而 当我同时运行所有这些时 有些通过 有些失败 我尝试在每个测试方法之间暂停 1 秒 但没有成功 有任何想法吗 在此先感谢您的帮助 你们可能有一些共享数据 检查正在使用
  • 上下文敏感与歧义

    我对上下文敏感性和歧义如何相互影响感到困惑 我认为正确的是 歧义 歧义语法会导致使用左推导或右推导构建多个解析树 所有可能的语法都是二义性的语言是二义性语言 例如 C 是一种不明确的语言 因为 x y 总是可以表示两个不同的事物 如下所述
  • 如何在 Blackberry Cascades 中显示具有特定号码的电话板

    我正在使用带有 C QT 和 QML 的 Blackberry Cascades 10 Beta 3 SDK 以及 Blackberry 10 Dev Alpha Simulator 和 QNX Momentics IDE 并且我正在尝试实
  • gcc 的配置选项如何确定默认枚举大小(短或非短)?

    我尝试了一些 gcc 编译器来查看默认枚举大小是否很短 至少一个字节 强制使用 fshort enums 或无短 至少 4 个字节 强制使用 fno short enums user host echo Static assert 4 si
  • 为什么在setsid()之前fork()

    Why fork before setsid 守护进程 基本上 如果我想将一个进程与其控制终端分离并使其成为进程组领导者 我使用setsid 之前没有分叉就这样做是行不通的 Why 首先 setsid 将使您的进程成为进程组的领导者 但它也
  • 如何在按钮单击时模拟按键 - Unity

    我对 Unity 中的脚本编写非常陌生 我正在尝试创建一个按钮 一旦单击它就需要模拟按下 F 键 要拾取一个项目 这是我当前的代码 在编写此代码之前我浏览了所有统一论坛 但找不到任何有效的东西 Code using System Colle
  • 有没有办法强制显示工具提示?

    我有一个验证字段的方法 如果无法验证 该字段将被清除并标记为红色 我还希望在框上方弹出一个工具提示 并向用户显示该值无效的消息 有没有办法做到这一点 并且可以控制工具提示显示的时间 我怎样才能让它自己弹出而不是鼠标悬停时弹出 If the
  • 编译时“strlen()”有效吗?

    有时需要将字符串的长度与常量进行比较 例如 if line length gt 2 Do something 但我试图避免在代码中使用 魔法 常量 通常我使用这样的代码 if line length gt strlen Do somethi
  • Linq-to-entities,在一个查询中获取结果+行数

    我已经看到了有关此事的多个问题 但它们已经有 2 年 或更长 的历史了 所以我想知道这方面是否有任何变化 基本思想是填充网格视图并创建自定义分页 所以 我还需要结果和行数 在 SQL 中 这将类似于 SELECT COUNT id Id N
  • 如何使用 Word Automation 获取页面范围

    如何使用办公自动化找到 Microsoft Word 中第 n 页的范围 似乎没有 getPageRange n 函数 并且不清楚它们是如何划分的 这就是您从 VBA 执行此操作的方法 转换为 Matlab COM 调用应该相当简单 Pub
  • 如何正确使用 std::condition_variable?

    我很困惑conditions variables以及如何 安全 使用它们 在我的应用程序中 我有一个创建 gui 线程的类 但是当 gui 是由 gui 线程构造时 主线程需要等待 情况与下面的函数相同 主线程创建互斥体 锁和conditi

随机推荐

  • 如何使用库

    由于某种原因 我永远无法使用任何语言的外部库 我正在寻找有关如何使用外部库及其工作原理的说明 解释 当我在线搜索时 我得到的片段似乎永远不适用于我下载并尝试使用的任何库 我在 Mac 和 PC 上工作 C 示例都很好 我使用带有 C 插件的
  • 如何使用 kendo 验证器验证日期的格式为 yyyy-MM-dd?

    我有一个剑道日期选择器 其构造如下 date kendoDatePicker format yyyy MM dd footer parseFormats MM dd yyyy dd MM yyyy 我想使用 kendo 验证器来验证日期是否
  • 使用 Python 实现 collat​​z 函数

    我目前在 自动化无聊的事情 中无法完成此挑战 我的代码是 def collatz number global seqNum if seqNum 2 0 return seqNum 2 elif seqNum 2 1 return 3 seq
  • 如何使用Tomcat 8 + Spring Boot + Maven

    根据参考 API使用 Tomcat 8和这个部署 Spring Boot 应用程序教程应该可以使用 Tomcat 8春季启动 默认使用 Tomcat 7 由于某种原因 它对我不起作用 我究竟做错了什么 pom xml
  • Java 6 中 java.nio.file.Files 的替代方案

    我有下面一段使用 java 7 功能的代码 例如java nio file Files 和 java nio file Paths import java io File import java io IOException import
  • 离子/角度传单指令 - 放大/缩小按钮不起作用

    我对传单地图上的默认放大 缩小按钮有一些问题 当我直接加载页面时 一切正常 但是当我将一种状态更改为声明传单指令所在位置时 按钮就不起作用 给你例子 http codepen io anon pen JkyEg editors 101 代码
  • 从指定列中减去 pandas 列

    如何从指定列中动态减去多个 pandas 数据帧列中的值 在这种情况下 如何从存款中减去 A B C 列 并将该值放入相应的 A B C 列中 date deposit A B C 0 2017 01 15 12 5 10 12 1 201
  • PHP 将每个项目的 foreach 输出显示到屏幕上

    我在 php 中注意到的一件事是 在脚本停止工作之前 屏幕上不会输出任何内容 对于我正在从事的项目 我输入了超过 100 个项目的列表 它对每个项目执行 HTTP 请求 完成后 显示一个页面 其中包含每个项目的状态 成功 失败等 我想知道是
  • lastModified() 函数返回当前日期和时间

    我的问题是 为什么当我在网页上使用 document lastModified 时 它会返回当前日期和时间 而不是该页面上次修改的时间 有任何想法吗 提前致谢 实际代码是 因为你现在正在修改它 检查一下这个example 为了根据您的要求进
  • 如何在云端成功托管用 Python 编写的 Telegram 机器人(免费)?

    我跟着本教程使用 Python 创建 Telegram 机器人 最后 我在我的机器上本地运行它ngrok 为了测试这个机器人 我在 Telegram 中向它发送了消息 有效 所以这是一个很好的教程 但是 现在我想在云端托管机器人 因为我当然
  • Rails/Javascript:如何将 Rails 变量注入(非常)简单的 javascript

    我想在rails中编写一个非常简单的javascript计算器 它将输入字段的数量乘以rails变量中存储的数字 item base price 所以 在 javascript coffeescript 方面 粗略地说是这样的 app as
  • 如何从 C 程序中获得 100% CPU 使用率

    这是一个非常有趣的问题 所以让我来介绍一下场景 我在国家计算博物馆工作 我们刚刚设法让一台 1992 年的 Cray Y MP EL 超级计算机运行起来 我们真的很想看看它能跑多快 我们认为最好的方法是编写一个简单的 C 程序来计算素数并显
  • 在 python 包中添加和读取 config.ini 文件

    我正在编写我的第一个 python 包 我想将其上传到 PyPI 上 我基于此构建了我的代码博客文章 我想将用户设置存储在 config ini 文件中 在同一包中的单独 python 模块中读取一次 每次运行包时 并将用户设置保存在该模块
  • 测试使用会话的 Sinatra 应用程序

    如何测试使用会话的 Sinatra 应用程序 get rack session gt foo gt blah 这段代码对我不起作用 我在我的应用程序中有 启用 会话 看起来问题实际上是有enable sessions活性 您必须停用此设置才
  • 如何在 .Net 中操纵令牌权限?

    我想使用 C 来确定分配给我的进程 线程令牌的权限 并根据需要进行调整 例如 为了让我的程序重新启动计算机 它必须首先启用SeShutdownPrivilege特权 如何通过托管代码安全地完成此操作 事实证明这并不简单 因为没有内置的机制
  • 我使用 AFNetWorking 时出现错误代码 -1011

    我在我们的客户公司做服务 我尝试通过 AFNetWorking 从他们的服务器获取一些信息 我们的客户鼓励使用 AFNetWorking 我使用 AFNetWorking 做了一些示例 并且成功了 但是当我使用我们的客户 URL 之一来获取
  • 如何调用Blazor服务器端CircuitHandler中的方法?

    我正在通过 Blazor 服务器端制作一个聊天室应用程序 我想显示每个用户的在线状态 我问了一个关于如何在关闭页面时获取事件的问题如何在 blazor 服务器端关闭页面时获取事件 现在看来CircuitHandler是最好的选择 当用户关闭
  • Python 快速排序 - 列表理解与递归(分区例程)

    我看了演讲 三个美丽的快速排序 并开始尝试快速排序 我在 python 中的实现与 c 非常相似 选择枢轴 围绕它进行分区并在较小和较大的分区上递归 我以为不是pythonic 这就是在 python 中使用列表理解的实现 def qsor
  • 如何在 Nginx 上使用 FastCGI 防止网关超时

    我正在运行 Django FastCGI 和 Nginx 我正在创建一个 api 人们可以通过 XML 发送一些数据 我将处理这些数据 然后为发送过来的每个节点返回一些状态代码 问题是 如果我处理 XML 的时间太长 我认为超过 60 秒
  • 当我尝试使用 UI Automation for PowerPoint 2013 时,我只能在使用 RangeFromPoint 时获取第一个字符/单词

    该代码适用于 Word 和 Outlook 但不适用于 PowerPoint 因为仅选择文本框的第一个字符或第一个单词 这是一个错误吗 有什么解决方法吗 在 PowerPoint 2013 中的简单 PowerPoint 幻灯片上尝试此操作