Objective c 易访问性API-Cocoa

Objective c 易访问性API-Cocoa,objective-c,cocoa,macos,Objective C,Cocoa,Macos,是否有任何方法(我认为使用可访问性API)可以在我的应用程序中按下按钮/按键,然后将鼠标悬停在菜单栏项上,再次按下,然后返回菜单项的名称、它所在的菜单和应用程序 我想在Cocoa/Objective-C(Mac)中这样做。这就是kAXMenuItemSelectedNotification通知的作用。使用此功能的一个简单方法是: 在“目标”弹出菜单中选择一个应用程序 从“抽屉”弹出菜单中选择“通知” 单击“选定菜单项”和“注册”(或在表格中双击) 从查看菜单中选择“通知日志” 切换到您选择的应

是否有任何方法(我认为使用可访问性API)可以在我的应用程序中按下按钮/按键,然后将鼠标悬停在菜单栏项上,再次按下,然后返回菜单项的名称、它所在的菜单和应用程序


我想在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
),在触发通知时被调用。请参阅文档: