代码之家  ›  专栏  ›  技术社区  ›  Mikayla Hutchinson

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

  •  15
  • Mikayla Hutchinson  · 技术社区  · 14 年前

    我正在将GTK应用程序集成到MacOSX中。MacOSX上的GTK是一些可可和碳基础知识的包装。我们有一些特定于平台的东西直接使用碳全局菜单API(它比COCOA更低级和更灵活,我们不需要是64位)。

    似乎GTK在Carbon把所有的键盘事件作为命令发送之前就已经把它们吞下去了。这是有道理的,因为没有碳指令到GTK世界的映射。一般来说,这不是问题,因为我们有一个全局密钥事件处理程序,并通过我们自己的命令系统分派所有内容。然而,这似乎阻止了命令-?从打开“帮助搜索”菜单,我找不到以编程方式执行此操作的方法。

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

    或者,发送命令-?按键到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。我用一个简单的单体(Cocoa)应用程序确认了keycode是正确的,但是InterpretKeyEvents也不能处理该应用程序中的事件。我找不到任何与该命令相关联的选择器。

    2 回复  |  直到 13 年前
        1
  •  0
  •   dgatwood    10 年前

    您可以使用可访问性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];
    
        2
  •  1
  •   MrDaniel Paul    12 年前

    你可以通过C/Objective-CA的电话 AppleScript (GUI) script ,这实际上将像用户一样对用户进行定点和单击,以以以方式打开“帮助”菜单程序。