Как отправить нажатия клавиш другому процессу в Objective-C

Я знаю, что здесь были некоторые вопросы по этому поводу, но у меня есть этот метод класса для отправки нажатий клавиш другому процессу, но, похоже, он работает частично. Если я отправлю NSString @"mystring", я верну "mmmmmmmm" (т.е. всегда первая буква, умноженная на длину исходной строки). Вот мой код, может кто-нибудь сказать мне, что мне не хватает. Кстати NSLog символов показывает правильный символ находящийся в переменной буфера. Другие вопросы, которые я рассмотрел 1. CGEventCreateKeyboardEvent и CGEventTapLocation 2.-CGEventPostToPSN - Как отправлять ключи с разными языковыми настройками клавиатуры?

+(void)writeString:(NSString *)valueToSet withFlags:(int)flags intoProcess:(ProcessSerialNumberPtr) process 
{

  CGEventSourceRef source = CGEventSourceCreate(kCGEventSourceStatePrivate);
  CGEventRef keyEventDown = CGEventCreateKeyboardEvent(source, 1, true);
  CGEventRef keyEventUp = CGEventCreateKeyboardEvent(source, 1, false);
  CGEventSetFlags(keyEventDown,0);                
  CGEventSetFlags(keyEventUp,0);
  UniChar buffer;
  CFRelease(source);
  for (int i = 0; i < [valueToSet length]; i++) {
    buffer = [valueToSet characterAtIndex:i];
    NSLog(@" %i place Character: %c",i,buffer);
    CGEventKeyboardSetUnicodeString(keyEventDown, 1, &buffer);
    CGEventKeyboardSetUnicodeString(keyEventUp, 1, &buffer);

    CGEventSetFlags(keyEventDown,flags);
    CGEventPostToPSN(process, keyEventDown);
    [NSThread sleepForTimeInterval: 0.01];
    CGEventSetFlags(keyEventUp,flags);
    CGEventPostToPSN(process, keyEventUp);
    [NSThread sleepForTimeInterval: 0.01];

  }
  CFRelease(keyEventUp);
  CFRelease(keyEventDown);
}

person AnonymousPlayer    schedule 17.05.2012    source источник
comment
как тогда вызвать вашу функцию?   -  person jimwan    schedule 12.07.2018


Ответы (1)


У вас есть отвод события, настроенный где-то еще в коде, в том же потоке? Если да, то это может происходить:

Вы публикуете событие, но поток, который должен их обрабатывать и отправлять через цепочку событий, заблокирован. Таким образом, вы отправляете события и блокируете их одновременно. В этом случае вы должны использовать таймер и отправлять события одно за другим, чтобы ваш кран событий мог обрабатывать те же самые события, которые вы только что отправили.

person bogdansrc    schedule 03.07.2012
comment
Нет, в какой-либо части программы не настроено отслеживание событий. Программа не предназначена для проверки нажатий клавиш или событий только для отправки их в PSN. - person AnonymousPlayer; 15.08.2012