【发布时间】:2011-02-19 17:17:36
【问题描述】:
有什么方法(我认为使用辅助功能 API)能够在我的应用程序中按下按钮/击键,然后将鼠标悬停在菜单栏项上并再次按下,然后返回菜单项的名称,即菜单在和应用程序中?
我想在 Cocoa/Objective-C (Mac) 中执行此操作。
【问题讨论】:
标签: objective-c cocoa macos
有什么方法(我认为使用辅助功能 API)能够在我的应用程序中按下按钮/击键,然后将鼠标悬停在菜单栏项上并再次按下,然后返回菜单项的名称,即菜单在和应用程序中?
我想在 Cocoa/Objective-C (Mac) 中执行此操作。
【问题讨论】:
标签: objective-c cocoa macos
这就是kAXMenuItemSelectedNotification 通知的用途。玩这些东西的一个简单方法是使用UI Browser:
这可以让您查看何时触发通知。您的代码可能如下所示:
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 作为通知的一部分)。
I would think actually selecting the item would be easier for a user, but if you really do want to press another key to complete the action, you can observe kAXSelectedChildrenChanged, which will be triggered when the selection moves from one menu项目到另一个。
【讨论】:
AXObserverCallback)。请参阅文档:developer.apple.com/library/mac/#documentation/Accessibility/…