CGEventCreateKeyboardEvent и CGEventTapLocation - PullRequest
2 голосов
/ 07 октября 2011

Мне трудно иметь дело с пользовательскими событиями клавиатуры. Я хочу иметь возможность отправлять любые ключи с / без kCGEventFlagMasks, такие как команда, Alt, Ctrl, Shift ...

например. Я хочу отправить текущее переднее приложение, давайте предположим, что это TextEdit, комбинация клавиш cmd + t, которая должна показывать окно шрифта.

Но в настоящее время только t добавляется в текущий документ TextEdit. Я попытался опубликовать событие с пользовательским набором CGEventFlags и альтернативно генерировать события keyDown и keyUp для cmd вокруг события t. Ключевые коды бесплатного приложения показывают мне, когда я использую набор CGEventFlags, что cmd + t была нажата, но эта комбинация клавиш не передается в TextEdit, только один т ...

Вот мой код:

...
flags = (flags | kCGEventFlagMaskCommand);
[self writeString:@"" withFlags:flags];
...

(void)writeString:(NSString *)valueToSet withFlags:(int)flags
{
UniChar buffer;
CGEventRef keyEventDown = CGEventCreateKeyboardEvent(NULL, 1, true);
CGEventRef keyEventUp = CGEventCreateKeyboardEvent(NULL, 1, false);
CGEventSetFlags(keyEventDown,0);                
CGEventSetFlags(keyEventUp,0);          
for (int i = 0; i < [valueToSet length]; i++) {
    [valueToSet getCharacters:&buffer range:NSMakeRange(i, 1)];
    CGEventKeyboardSetUnicodeString(keyEventDown, 1, &buffer);
    CGEventSetFlags(keyEventDown,flags);
    CGEventPost(kCGSessionEventTap, keyEventDown);
    CGEventKeyboardSetUnicodeString(keyEventUp, 1, &buffer);
    CGEventSetFlags(keyEventUp,flags);
    CGEventPost(kCGSessionEventTap, keyEventUp);

}
CFRelease(keyEventUp);
CFRelease(keyEventDown);

}

Мне также трудно понять значение CGEventTapLocation. Я не знаю, какое событие было бы наиболее подходящим для моей задачи. Описание в Кварцевом справочнике событий меня не просветляет:

kCGHIDEventTap
Specifies that an event tap is placed at the point where HID system events enter the window server.


kCGSessionEventTap
Specifies that an event tap is placed at the point where HID system and remote control events enter a login session.


kCGAnnotatedSessionEventTap
Specifies that an event tap is placed at the point where session events have been annotated to flow to an application.

Я видел много сообщений на эту тему, но никто из них не помог мне решить мою проблему ... Спасибо за вашу помощь!

1 Ответ

2 голосов
/ 17 октября 2011

Это не ответ на вопрос, а мой текущий обход через AppleScript:

appleScriptString = [NSString stringWithFormat:@"tell application \"System Events\" to key code %d using %@",keyCode, modifierDownString];

, который я передаю этой функции:

- (void)runScript:(NSString*)scriptText
{
    NSDictionary *error = nil;
    NSAppleEventDescriptor *appleEventDescriptor;
    NSAppleScript *appleScript;

    appleScript = [[NSAppleScript alloc] initWithSource:scriptText];
    appleEventDescriptor = [appleScript executeAndReturnError:&error];

    [appleScript release];
}
...