2013-04-15 37 views
11

Muszę wysłać naciśnięcia klawiszy, aby przedostać się do większości aplikacji z aplikacji Cooca.Wysyłaj sekwencje klawiszy do najbardziej wysuniętej aplikacji z aplikacji piaskownicy kakao.

Mam już działający kod za pomocą CGEventCreateKeyboardEvent() i AXUIElementPostKeyboardEvent(), ale działa tylko wtedy, gdy aplikacja nie jest piaskownica.

Szukałem google dla tego samego, ale nie znalazłem żadnego działającego rozwiązania.

Widziałem, że aplikacja Tekst i kilka innych robi to samo w środowisku piaskownicy, więc zastanawiam się, czy ktoś mi pomoże dowiedzieć się, że jak aText.app i inni są w stanie wysłać naciśnięcia klawiszy w środowisku piaskownicy.

Dzięki,

+0

Czy możesz podać wystarczającą ilość informacji o tym, które aplikacje robią to i kiedy mogę je odtworzyć? Nigdy nie widziałem, jak to się dzieje z aplikacją piaskownicy. –

+0

Proszę sprawdzić aText.app, po prostu napisz aText w Google i sprawdź pierwszy link.Wygląda na to, że ich wersja witryny nie jest piaskowana, ale wersja sklepu z aplikacjami działa i działa w środowisku piaskownicy bez użycia żadnego tymczasowego wyjątku. proszę dać mi znać, jeśli się mylę. Dzięki – AmitSri

Odpowiedz

2

To jest rzeczywiście możliwe. Zrobiłem przykładową aplikację dostępną tutaj - SendKey at GitHub

wziąłem łatwą drogę i zaczął z prostego AppleScript:

delay 5 

tell application "System Events" 
    repeat 10 times 
     keystroke "#" 
    end repeat 
end tell 

do „opóźnienie” w scenariuszu po prostu daje mi wystarczająco dużo czasu, aby edytora tekstu przednia aplikacja. Proponuję zacząć od uruchomienia tego skryptu, aby zobaczyć, co robi.

Potem stworzył projekt Xcode przy użyciu szablonu domyślnej aplikacji i napisał:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
{ 
    NSString*  scriptPath = [[NSBundle mainBundle] pathForResource:@"sendkey" ofType:@"scpt"]; 
    NSURL*   scriptURL = [NSURL fileURLWithPath:scriptPath]; 
    NSDictionary* errors; 
    NSAppleScript* script  = [[NSAppleScript alloc] initWithContentsOfURL:scriptURL error:&errors]; 

    NSLog(@"%@", errors); 

    [script executeAndReturnError:&errors]; 

    NSLog(@"%@", errors); 
} 

Przetestowałem to bez włączania piaskownice aby zweryfikować to działa i to zrobił. Potem włączyłem Sandboxing i, oczywiście, się zepsuł. Ale na szczęście jest to na odwrót. Na razie Apple udziela tymczasowego uprawnienia o nazwie com.apple.security.temporary-exception.apple-events. Możesz też zażądać wyjątku dla "com.apple.systemevents". To właśnie mój plik uprawnienia wygląda następująco:

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" 
    "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
    <dict> 
    <key>com.apple.security.temporary-exception.apple-events</key> 
    <array> 
     <string>com.apple.systemevents</string> 
    </array> 
    <key>com.apple.security.app-sandbox</key> 
    <true /> 
    </dict> 
</plist> 

Gdy dodałem to uprawnienie do mojej piaskownicy aplikacji i podpisał go, pracował jako kolejny oczekiwano.

Teraz, jeśli chcesz wysłać inne klucze, to odpowiedź na pytanie & zademonstruje jak zbudować swój skrypt w locie - Passing variables to an applescript.

Oczywiście, gdy wszystkie te czynności będą działać, prawdopodobnie można zwrócić się do klasy NSAppleEventDescriptor i klas pokrewnych, aby zbudować zdarzenie w kodzie, ale nie grałem przy użyciu tej techniki.

Należy pamiętać, że Apple sugeruje wykonać następujące czynności przy użyciu tymczasowego uprawnienia:

Jeśli nie zdecydujesz się piaskownica aplikację teraz lub użyć tymczasowego prawa wyjątku, wykorzystywać system raportowania błędów firmy Apple do powiadom Apple o napotkanym problemie. Apple bierze pod uwagę funkcje , ponieważ rozwija platformę OS X. Ponadto należy użyć pola Uwagi do recenzji w witrynie iTunes Connect, aby wyjaśnić, dlaczego wymagany jest wyjątek.

+0

Witam, dzięki za twoje wysiłki. Ale mam coś, czego nie dostaję. Kiedy wyjaśnisz, co jest scenariuszem Apple, to wielkie dzięki, ale prawdziwe pytanie dotyczy robienia tego bez skryptu Apple lub tymczasowego wyjątku. – AmitSri

+0

Sprawdziłem uprawnienia aText.app za pomocą narzędzia codesign i nie znalazłem żadnego tymczasowego wyjątku, a gdy dodam wyjątek tymczasowy w mojej aplikacji testowej, widzę, że w uprawnieniach za pośrednictwem codesign, wydaje się, że aText.app nie używa tymczasowy wyjątek. – AmitSri

+0

Może być coś bardzo prostego, ale jeszcze mnie nie uderzyło. Nadal staram się znaleźć elegancki sposób, aby to zrobić. I opublikuje, jeśli znajdzie rozwiązanie, ponieważ wydaje się dość popularne. :) dziękuję – AmitSri