Mac 辅助功能和非本机小部件

问题描述 投票:0回答:1

我正在为 Tcl/Tk 工具包开发辅助功能支持,目前正在 macOS 上使用基于 C 的辅助功能 API。我试图了解如何为各种 Tk 小部件创建可访问性对象,这些小部件不是基于 Mac 的小部件的包装器(它们是使用 Mac API 绘制的,但例如没有 NSButton 的包装器)。

辅助功能 API 展示了如何创建顶级辅助功能对象:

pid_t pidt = getpid();
AXUIElementRef acc_app = AXUIElementCreateApplication(pidt);

然而,尚不清楚的是如何从将填充到应用程序中的子小部件创建 AXUIElementRef 对象。此代码循环访问应用程序中的子 AXUIElementRefs:

CFArrayRef attArray;
AXUIElementCopyAttributeNames(acc_app, &attArray);
NSLog(@"%@", attArray ? (__bridge NSArray *)attArray : @"nil");

CFTypeRef childrenPtr;
AXUIElementCopyAttributeValue(app, kAXChildrenAttribute, &childrenPtr);
NSArray *children = (__bridge NSArray *)childrenPtr;
NSLog(@"%@", children);

if (attArray) CFRelease(attArray);
if (childrenPtr) CFRelease(childrenPtr);

但我不清楚如何用

kAXChildrenAttribute
来指定小部件。

我发现这个函数调用:

AXUIElementSetAttributeValue(AXUIElementRef element, CFStringRef attribute, CFTypeRef value) 

这似乎允许我指定具有“children”属性的子窗口小部件 - 我是否必须以某种方式将 Tk_Window(C 中的子窗口)转换为 CFTypeRef 才能构建该关联?还有其他人使用过非原生小部件吗?

macos accessibility tcltk
1个回答
0
投票

看起来

NSAccessibilityElement
就是我要找的。 https://developer.apple.com/documentation/appkit/nsaccessibilityelement-swift.class?language=objc 上的文档很有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.