Objective c 易访问性API-Cocoa
是否有任何方法(我认为使用可访问性API)可以在我的应用程序中按下按钮/按键,然后将鼠标悬停在菜单栏项上,再次按下,然后返回菜单项的名称、它所在的菜单和应用程序Objective c 易访问性API-Cocoa,objective-c,cocoa,macos,Objective C,Cocoa,Macos,是否有任何方法(我认为使用可访问性API)可以在我的应用程序中按下按钮/按键,然后将鼠标悬停在菜单栏项上,再次按下,然后返回菜单项的名称、它所在的菜单和应用程序 我想在Cocoa/Objective-C(Mac)中这样做。这就是kAXMenuItemSelectedNotification通知的作用。使用此功能的一个简单方法是: 在“目标”弹出菜单中选择一个应用程序 从“抽屉”弹出菜单中选择“通知” 单击“选定菜单项”和“注册”(或在表格中双击) 从查看菜单中选择“通知日志” 切换到您选择的应
我想在Cocoa/Objective-C(Mac)中这样做。这就是
kAXMenuItemSelectedNotification
通知的作用。使用此功能的一个简单方法是:
- 在“目标”弹出菜单中选择一个应用程序
- 从“抽屉”弹出菜单中选择“通知”
- 单击“选定菜单项”和“注册”(或在表格中双击)
- 从查看菜单中选择“通知日志”
- 切换到您选择的应用程序并选择菜单项
AXError err;
AXObserverRef observer;
pid_t currentAppPID = [NSRunningApplication currentApplication].processIdentifier;
if ( (err = AXObserverCreate(currentAppPID, notificationCallback, &observer) != kAXErrorSuccess); // XXX failed
CFRunLoopAddSource(CFRunLoopGetCurrent(), AXObserverGetRunLoopSource(observer), kCFRunLoopDefaultMode);
AXUIElementRef element = AXUIElementCreateApplication(currentAppPID);
if (element == NULL); // XXX failed
if ( (err = AXObserverAddNotification(observer, element, kAXMenuItemSelectedNotification, NULL)) != kAXErrorSuccess); // XXX failed
请注意,您必须单独观察每个正在运行的应用程序(以及启动/退出时的其他应用程序),或者注册NSWorkspaceDidActivateApplicationNotification
,然后在此时注销/注册最前面的应用程序(后者在10.6下可能最简单,因为通知中包含NSRunningApplication
)
我认为用户实际选择该项会更容易,但如果您真的想按另一个键来完成操作,您可以观察
kAXSelectedChildrenChanged
,当选择从一个菜单项移动到另一个菜单项时会触发该操作。我不确定是否理解您的意思…我在“DidFinishLaunching”:[[[NSWorkspace sharedWorkspace]notificationCenter]addObserver:selector:@selector(mySelector:)name:NSWorkspaceDidActivateApplicationNotification对象:nil];我将您的代码放在我的选择器中-(void)mySelector:(NSNotification*)注意:对吗?我有两个错误:“Notificationcallback undeclared”和“}”之前应为表达式。我不明白您的意思。回调是什么?如何实现?它是一个函数(由typedef指定的签名,在本例中为AXObserverCallback
),在触发通知时被调用。请参阅文档: