如何找到任何活动应用程序的闪烁光标位置?

2024-04-12

我正在为 Mac OS 开发一个应用程序,我想找到当前应用程序的文本光标(插入符号导航)的位置? 到目前为止,我已经让它请求可访问权限,并且我也可以监视 keyEvents,但是如何找到闪烁的光标位置?

(我不是在寻找鼠标光标位置,我想要文本光标/插入符号导航 http://en.wikipedia.org/wiki/Caret_navigation)


您将需要使用辅助功能 API 来执行此操作。 这是很多丑陋的代码,并且可能并不总是有效,具体取决于这些应用程序视图中的视图层次结构和可访问性支持程度。 非 Cocoa 应用程序可能会出现问题并且无法运行。 使用 WebKit 进行渲染的视图也带来了整个 html 可访问性的挑战! :)

我从 Dash 的制作者 Bogdan Popescu 那里得到了这个片段。 不要直接复制并粘贴此代码。 研究它,查看 API 文档对每个函数和类型的说明,并从中慢慢构建一些东西。 了解 AX API 并使用它们需要花费大量时间。以通用方式很好地使用它们需要更长的时间。 它是 Core Foundation 风格的 C,与您可能习惯的直接 Cocoa Objective-C 有很大不同。

CFTypeRef system = nil;
system = AXUIElementCreateSystemWide();
CFTypeRef application = nil;
CFTypeRef focusedElement = nil;
CFRange cfrange;
AXValueRef rangeValue = nil;
// Find the currently focused application
if(AXUIElementCopyAttributeValue(system, kAXFocusedApplicationAttribute, &application) == kAXErrorSuccess)
{
    // Find the currently focused UI Element
    if(AXUIElementCopyAttributeValue(application, kAXFocusedUIElementAttribute, &focusedElement) == kAXErrorSuccess)
    {
        // Get the range attribute of the selected text (i.e. the cursor position)
        if(AXUIElementCopyAttributeValue(focusedElement, kAXSelectedTextRangeAttribute, (CFTypeRef *)&rangeValue) == kAXErrorSuccess)
        {
            // Get the actual range from the range attribute
            if(AXValueGetValue(rangeValue, kAXValueCFRangeType, (void *)&cfrange))
            {
                CFTypeRef bounds = nil;
                textRect = NSZeroRect;
                if(AXUIElementCopyParameterizedAttributeValue(focusedElement, kAXBoundsForRangeParameterizedAttribute, rangeValue, (CFTypeRef *)&bounds) == kAXErrorSuccess)
                {
                    CGRect screenRect;
                    AXValueGetValue(bounds, kAXValueCGRectType, &screenRect);
                    if(bounds)
                    {
                        textRect = [DHAbbreviationManager cocoaRectFromCarbonScreenRect:screenRect];
                        CFRelease(bounds);
                    }
                }
            }
            if(rangeValue)
            {
                CFRelease(rangeValue);
            }
        }
    }
    if(focusedElement)
    {
        CFRelease(focusedElement);
    }
}
if(application)
{
    CFRelease(application);
}
if(system)
{
    CFRelease(system);
}

将 AX 点从 Carbon 转换为 Cocoa Screen 点。

+ (NSPoint)cocoaScreenPointFromCarbonScreenPoint:(NSPoint)carbonPoint
{
   return NSMakePoint(carbonPoint.x, [[[NSScreen screens] objectAtIndex:0] frame].size.height - carbonPoint.y);
}

研究这些位。

您还想深入研究辅助功能检查器应用程序随 Xcode 一起提供,以及来自 Apple 的类似示例代码,称为UI元素检查器

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

如何找到任何活动应用程序的闪烁光标位置? 的相关文章

随机推荐

  • 动态注册本地Vue.js组件

    我们知道possible http v1 vuejs org guide components html Registration动态注册全局 Vue js 版本 1 组件 如下所示 Vue component my component M
  • SAS 宏日期问题

    我对 SAS 完全陌生 我的数据库包含 2000 2011 年的数据 我的数据集列表对于每个数据集都是这样的date TP 2004012 for 26JAN2004 TP 20040127 for 27JAN2004 TP 2004012
  • 在 PowerShell 中调用通用静态方法

    如何在 Powershell 中调用自定义类的通用静态方法 给定以下课程 public class Sample public static string MyMethod
  • 联合初始化

    我正在尝试全局初始化一个联合 如下例所示 include
  • UIView 子类绘制背景,尽管完全是空的drawRect: - 为什么?

    因此 我有一个自定义 UIView 子类 它可以绘制圆角边缘 东西绘制得很完美 但是背景总是填充整个边界 尽管首先剪切到路径 边框也画出来了above矩形背景 尽管我在绘制矩形中绘制了边框 在背景之前 所以我删除了drawRect 的全部内
  • Qt 4.6 将对象和子对象添加到 QWebView 窗口对象(C++ 和 Javascript)

    我正在使用 Qt 的 QWebView 并且发现添加到 webkit 窗口对象有很多很好的用途 我想做的一件事是嵌套对象 例如 在 JavaScript 中我可以 var api new Object api os new Object a
  • C++11 std::forward_as_tuple 和 std::forward

    我是不是该std forward当我将函数参数用作参数时std forward as tuple template
  • 在屏幕截图中捕获鼠标光标

    我正在开发 Mac 桌面应用程序 我正在使用它捕获屏幕 CGImageRef screenShot CGWindowListCreateImage CGRectInfinite kCGWindowListOptionAll kCGNullW
  • 使用 CDK Pipeline 时如何执行标准和控制

    CDK管道 https aws amazon com blogs developer cdk pipelines continuous delivery for aws cdk applications 非常棒 特别适合跨账户部署 它使开发
  • C:无法在文件上写入数据

    我想打开一个文件 在上面写一些数据 所以我必须使用 Fopen 我不能使用open 因为我在其他一些事情上需要fopen 现在 如果我想使用 fwrite 在文件上写入 我不知道为什么这就是我在代码 option1 中提到的内容 但是如果我
  • sql 查询中的错误“)”附近的语法不正确

    insert into p article client detail current article id sector detail id select article id 2818 from select article id fr
  • Solr Custom RequestHandler - 注入查询参数

    简短的问题 我正在寻找一种方法 java 来拦截对 Solr 的查询并注入我的业务逻辑提供的一些额外的过滤参数 我应该使用什么结构 语境 首先 我要坦白一点 对于 Solr 我是个菜鸟 对我来说 设置一个服务器 定义一个模式 编写一个功能性
  • 如何将 templatefile 函数传递给 Terraform 0.12 中 EC2 资源的 user_data 参数?

    我需要通过以下templatefile功能为user data在 EC2 资源中 谢谢 用户数据 tf templatefile path module init ps1 environment var env hostnames dev
  • 在R中合并多个栅格

    我一直在尝试找到一种省时的方法来在 R 中合并多个光栅图像 这些是来自乞力马扎罗南部地区的相邻 ASTER 场景 我的目标是将它们放在一起以获得一张大图像 这是我到目前为止得到的 对象 ast14dmo 代表 RasterLayer 对象列
  • 使用node.js核心zlib模块压缩成.zip文件

    如何压缩一个或多个文件并将其保存到 zip包含所提供的 node js 的扩展文件zlib https nodejs org api zlib html模块 我想出了如何保存到 gz使用 gzip 如下 const gzip zlib cr
  • 堆叠子图的对齐

    EDIT 我找到了自己的答案 见下文 如何在子图中对齐图像 for ax in axes ax set anchor W EDIT END 我有一些用 imshow 绘制的数据 它在 x 方向上很长 因此我通过在垂直堆叠的子图中绘制数据切片
  • 如何在 IntelliJ IDEA 中自定义 SonarLint 规则?

    是否可以让 SonarLint for IntelliJ IDEA 仅强制执行我在 Sonar 服务器上启用的规则 因为现在可以使用当前版本的 SonarLint 我使用的版本3 0 0 2041 https plugins jetbrai
  • Rust 中的函数是第一类对象吗?

    函数可以作为参数传递吗 例如 在 JavaScript 中 您可以将函数作为参数传递 如下所示 setInterval function 1000 他们是一流的 与 JavaScript 不同 Rust 有两种类型 函数和闭包 fn fir
  • 在 Clojure 中使用 http://foobar.mp3 重定向到 http://fizzbar.mp3

    我正在尝试以编程方式下载 mp3 文件这个 RSS 提要 http podcast menlo church feed 当我打开一个网址时 例如 http menlohurch podbean com mf feed 5gv2gb 1702
  • 如何找到任何活动应用程序的闪烁光标位置?

    我正在为 Mac OS 开发一个应用程序 我想找到当前应用程序的文本光标 插入符号导航 的位置 到目前为止 我已经让它请求可访问权限 并且我也可以监视 keyEvents 但是如何找到闪烁的光标位置 我不是在寻找鼠标光标位置 我想要文本光标