Программно открыть меню справки Mac - PullRequest
15 голосов
/ 17 ноября 2010

Я интегрирую приложение GTK # в Mac OS X. GTK в Mac OS X - это оболочка для некоторых основ Cocoa и Carbon. У нас есть кое-что для платформы, напрямую использующее API-интерфейсы глобального меню Carbon (он более низкоуровневый и гибкий, чем Cocoa, и нам не нужно быть 64-битным).

Похоже, что GTK поглощает все события клавиатуры, прежде чем Carbon отправит их в виде команд. Это имеет смысл, потому что в мире GTK нет отображения команд Carbon. В общем, это не проблема, потому что у нас есть глобальный ключевой обработчик событий, и мы отправляем все через нашу собственную систему команд. Тем не менее, это, кажется, мешает Cmd-? от открытия меню поиска справки, и я не могу найти способ сделать это программно.

Функция MenuSelect в Менеджере меню является многообещающей, но я не нашел способа автоматически определить координату, и по какой-то причине он работает только тогда, когда я нажимаю комбинацию дважды ...

В качестве альтернативы, способ отправки Cmd-? Было бы хорошо, если бы нажатие клавиши для обработки команд Carbon или синтезирования командного события было бы неплохо, но мне не повезло в этой области.

Carbon ProcessHICommand бесполезен без идентификатора команды, и я не могу понять, что это такое (если оно есть)

Что касается Какао, я могу заполучить 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 также не работал с событием в этом приложении. И я не могу найти селектор, связанный с командой.

Ответы [ 2 ]

1 голос
/ 06 февраля 2012

Вы можете сделать это, вызвав из скрипта C / Objective-C AppleScript (GUI) , который, по сути, будет указывать и щелкать пользователя так же, как пользователь, чтобы открыть справку.меню программно.

0 голосов
/ 24 декабря 2013

Вы можете использовать специальные 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];
...