gpt4 book ai didi

cocoa - 以编程方式打开 Mac 帮助菜单

转载 作者:行者123 更新时间:2023-12-03 16:02:45 28 4
gpt4 key购买 nike

我正在将 GTK# 应用程序集成到 Mac OS X 中。Mac OS X 上的 GTK 是一些 Cocoa 和 Carbon 基础知识的包装。我们直接使用 Carbon 全局菜单 API 有一些特定于平台的东西(它比 Cocoa 更底层、更灵活,而且我们不需要是 64 位)。

看来 GTK 在 Carbon 将键盘事件作为命令调度之前就吞噬了所有键盘事件。这是有道理的,因为 Carbon 命令没有映射到 GTK 世界。一般来说,这不是问题,因为我们有一个全局按键事件处理程序,并通过我们自己的命令系统调度所有内容。然而,这似乎阻止了 Cmd-?打开“帮助”搜索菜单,但我找不到以编程方式执行此操作的方法。

菜单管理器的 MenuSelect 功能很有前途,但我还没有找到自动确定坐标的方法,并且由于某种原因它只有在我按两次组合键时才起作用......

或者,有一种方法可以调度 Cmd-?通过击键进行 Carbon 的命令处理或直接合成命令事件会很好,但我在该领域没有任何运气。

如果没有命令 ID,Carbon 的 ProcessHICommand 就没有任何用处,而且我无法弄清楚它是什么(如果有的话)

关于 Cocoa,我可以获取 NSWindow 并调用 InterpretKeyEvents,但我没有成功合成 NSEvent - 它只是发出蜂鸣声。我正在使用的事件是

var evt = NSEvent.KeyEvent (NSEventType.KeyDown, System.Drawing.PointF.Empty,
NSEventModifierMask.CommandKeyMask | NSEventModifierMask.ShiftKeyMask,
0, win.WindowNumber, NSGraphicsContext.CurrentContext, "?", "?",
false, (ushort) keycode);

根据 GTK 键映射确定键码为 44。我使用普通的 MonoMac (Cocoa) 应用程序确认键码是正确的,但 InterpretKeyEvents 也不适用于该应用程序中的事件。我找不到与该命令关联的任何选择器。

最佳答案

您可以使用辅助功能 API 来假装按下菜单项。

NSString *helpMenuTitle = [[[[NSApplication sharedApplication] mainMenu] itemWithTag:HELP_MENU_TAG] title];
AXUIElementRef appElement = AXUIElementCreateApplication(getpid());
AXUIElementRef menuBar;
AXError error = AXUIElementCopyAttributeValue(appElement,
kAXMenuBarAttribute,
(CFTypeRef *)&menuBar);
if (error) {
return;
}

CFIndex count = -1;
error = AXUIElementGetAttributeValueCount(menuBar, kAXChildrenAttribute, &count);
if (error) {
CFRelease(menuBar);
return;
}

NSArray *children = nil;
error = AXUIElementCopyAttributeValues(menuBar, kAXChildrenAttribute, 0, count, (CFArrayRef *)&children);
if (error) {
CFRelease(menuBar);
return;
}

for (id child in children) {
AXUIElementRef element = (AXUIElementRef)child;
id title;
AXError error = AXUIElementCopyAttributeValue(element,
kAXTitleAttribute,
(CFTypeRef *)&title);
if ([title isEqualToString:helpMenuTitle]) {
AXUIElementPerformAction(element, kAXPressAction);
CFRelease(title);
break;
}
CFRelease(title);
}
CFRelease(menuBar);
[children release];

关于cocoa - 以编程方式打开 Mac 帮助菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4200925/

28 4 0