我正在为 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 才能构建该关联?还有其他人使用过非原生小部件吗?
看起来
NSAccessibilityElement
就是我要找的。 https://developer.apple.com/documentation/appkit/nsaccessibilityelement-swift.class?language=objc 上的文档很有帮助。