我一直无法订阅当前窗口的更改,但您可以向辅助功能API请求当前应用程序和当前应用程序中最前面的窗口。
想象一下,您有一个名为CurrentAppData的类,其中包含以下数据:
@interface CurrentAppData : NSObject {
NSString* _title;
AXUIElementRef _systemWide;
AXUIElementRef _app;
AXUIElementRef _window;
}
查找当前应用程序的代码大致如下:
-(void) updateCurrentApplication {
_app = (AXUIElementRef)[CurrentAppData
valueOfExistingAttribute:kAXFocusedApplicationAttribute
ofUIElement:_systemWide];
_window = (AXUIElementRef)[CurrentAppData
valueOfExistingAttribute:kAXFocusedWindowAttribute
ofUIElement:_app];
NSString* appName = [CurrentAppData descriptionOfValue:_window
beingVerbose:TRUE];
[self setTitle:appName];
}
在这个例子中,_systemWide变量在类的init函数中被初始化,如下所示:
_system = AXUIElementCreateSystemWide();
valueOfExistingAttribute类函数看起来像这样:
+ (id)valueOfExistingAttribute:(CFStringRef)attribute ofUIElement:(AXUIElementRef)element
{
id result = nil;
NSArray *attrNames;
if (AXUIElementCopyAttributeNames(element, (CFArrayRef *)&attrNames) == kAXErrorSuccess)
{
if ( [attrNames indexOfObject:(NSString *)attribute] != NSNotFound
&&
AXUIElementCopyAttributeValue(element, attribute, (CFTypeRef *)&result) == kAXErrorSuccess
)
{
[result autorelease];
}
[attrNames release];
}
return result;
}
这个之前的函数是从苹果的UIElementInspector示例中提取的,这也是了解无障碍API的好资源。