2010-11-17 11 views
15

Integruję aplikację GTK # z systemem Mac OS X. GTK na Mac OS X to otoki na niektórych podstawach Cocoa i Carbon. Mamy pewne specyficzne dla platformy rzeczy bezpośrednio za pomocą API Carbon Global API (jest bardziej nisko-poziomowy i elastyczny niż Cocoa, i nie musimy być 64-bitowymi).Programowo otwarte menu Pomocy Macintosha

Wygląda na to, że GTK przechwytuje wszystkie zdarzenia na klawiaturze, zanim Carbon wywoła je jako polecenia. Ma to sens, ponieważ nie ma mapowania poleceń węglowych do świata GTK. Zasadniczo nie stanowi to problemu, ponieważ mamy globalną procedurę obsługi zdarzeń i wysyłamy wszystko za pośrednictwem naszego własnego systemu poleceń. Jednak wydaje się, że to uniemożliwia Cmd-? od otwierania menu wyszukiwania Pomocy i nie mogę znaleźć sposobu, aby zrobić to programowo.

funkcja menuSelect menu menedżera jest obiecujący, ale nie zorientowali się, sposób określenia współrzędnych automatycznie, iz jakiegoś powodu to działa tylko wtedy, kiedy uderzył w kombinacji dwa razy ...

Alternatywnie, sposób wysłać Cmd-? naciśnięcie klawisza do obsługi poleceń systemu Carbon lub zsyntetyzowanie zdarzenia polecenia byłoby dobre, ale nie miałem szczęścia w tym obszarze.

ProcessHICommand Carbon nie jest jakiekolwiek wykorzystanie bez ID poleceń i nie mogę dowiedzieć się, co to jest (jeśli istnieje)

chodzi kakao, mogę zdobyć w NSWindow i InterpretKeyEvents zadzwonić, ale Nie miałem szczęścia w syntezowaniu NSEvent - po prostu pika. Impreza używam jest

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

keyCode jest określana na podstawie mapy klawiatury GTK być 44. potwierdziły, że keycode była poprawna przy użyciu zwykłego Monoman (Cocoa) APP ale InterpretKeyEvents nie działa ze zdarzeniem, które w aplikacja albo. I nie mogę znaleźć żadnego selektora powiązanego z poleceniem.

+2

Użytkownicy pytali o Cmd-Shift-? keybinding, aby otworzyć menu wyszukiwania Pomocy. W jakiś sposób pętla zdarzeń GTK uniemożliwia działanie wbudowanej obsługi. –

+0

Czy podczas imprezy kakaowej próbowałeś użyć "/" zamiast "?". –

+4

Na marginesie, twoje stwierdzenie, że węgiel jest "bardziej niskopoziomowy i elastyczny niż kakao" jest niepoprawne. Carbon to całkowicie oddzielny interfejs API, który został zaprojektowany z myślą o współpracy z systemem Mac OS 8/9. Jest on przestarzały i źle utrzymany i nie jest "pod" kakao w żaden sposób. Kakao jest w rzeczywistości dużo starsze niż węgiel, mimo że na pierwszy rzut oka jest nowocześniejsze. Powinieneś naprawdę współpracować z Cocoa zamiast Carbon. –

Odpowiedz

0

Możesz użyć interfejsów API ułatwień dostępu, aby sfałszować naciśnięcie pozycji menu.

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]; 
+0

Znaleźliśmy inne rozwiązanie, które wymagało naprawienia zestawu narzędzi GTK, aby nie przechwycić tego klawisza, ale pozwoliłoby Cocoa go obsłużyć. Jednak akceptuję tę odpowiedź, ponieważ jest to dobre rozwiązanie dla każdego, kto chce polegać na strukturach dostępności. –

+0

Ostrożnie. Nie powiedzie się to w żadnym języku innym niż angielski ze względu na zakodowany @ tytuł "Pomocy". Musisz przypisać wartość tagu do menu pomocy w menu głównym aplikacji, a następnie pobrać rzeczywisty tytuł menu i użyć go. – dgatwood

1

Możesz to zrobić przez wywołanie z C/Objective-C a AppleScript (GUI) script, co w zasadzie spowoduje wskazanie i kliknięcie użytkownika tak, jak zrobiłby to użytkownik, aby otworzyć menu pomocy programowo.

+0

Nie mogę tak naprawdę mieć aplikacji zależą od frameworków dostępności ... –

Powiązane problemy