#macos #cocoa #cgeventtap
#macos #какао #cgeventtap
Вопрос:
Мне трудно справиться с пользовательскими событиями клавиатуры. Я хочу иметь возможность отправлять любой ключ с / без флаговых масок kcgevent, таких как command, alt, ctrl, shift…
например, я хочу отправить текущее самое переднее приложение, предположим, что это TextEdit, комбинация клавиш cmd t, которая должна отображать окно шрифта.
Но в настоящее время в текущий документ TextEdit добавляется только t . Я попытался опубликовать событие с помощью настраиваемых CGEventFlags и, в качестве альтернативы, генерировать события keyDown и keyUp для cmd вокруг события t. Коды клавиш бесплатного приложения показывают мне, когда я использую набор CGEventFlags, что был нажат cmd t, но эта комбинация клавиш не передается в TextEdit, только один t …
Вот мой код:
...
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:amp;buffer range:NSMakeRange(i, 1)];
CGEventKeyboardSetUnicodeString(keyEventDown, 1, amp;buffer);
CGEventSetFlags(keyEventDown,flags);
CGEventPost(kCGSessionEventTap, keyEventDown);
CGEventKeyboardSetUnicodeString(keyEventUp, 1, amp;buffer);
CGEventSetFlags(keyEventUp,flags);
CGEventPost(kCGSessionEventTap, keyEventUp);
}
CFRelease(keyEventUp);
CFRelease(keyEventDown);
}
Мне также трудно понять значение CGEventTapLocation. Я не знаю, какое событие tap было бы наиболее подходящим для моей задачи. Описание в ссылке на событие Quartz меня не просветляет:
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:
Это не ответ на вопрос, а мой текущий обходной путь с помощью 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:amp;error];
[appleScript release];
}
Комментарии:
1. Спасибо — это было на самом деле намного проще и работоспособное решение для меня.