CGEventSetFlags - обнаруживает, когда требуется клавиша-модификатор сдвига из локальной строки

это мой первый пост, дайте мне знать, если что-то нужно отредактировать.

В настоящее время у меня есть функция, которая будет возвращать код виртуальной клавиши клавиатуры Apple, передавая ей символ; CGKeyCode keyCodeForChar(), это работает, и я проверил результаты по различным веб-источникам.

Локальная строка, такая как NSString *myString = @"Hello World!", разбивается, и каждый символ обрабатывается, CGKeyCode извлекается и пытается быть записанным с использованием CGEventPost(). Это работает, однако в моей попытке определить правильные флаги, когда буква должна быть заглавной, вся строка печатается как нижний регистр. Это мой код на данный момент:

NSString *myString = @"Hello World!";
if (![self.view.window isKeyWindow])
{
    for (int i = 0; i < myString.length; i++)
    {
        char c = [theString characterAtIndex:i];
        CGKeyCode keyCode = keyCodeForChar(c);

        CGEventRef event;
        CGEventFlags flags = kCGEventFlagMaskShift;
        CGEventSourceRef source = CGEventSourceCreate(kCGEventSourceStateCombinedSessionState);

        // Key down event
        event = CGEventCreateKeyboardEvent(source, keyCode, true);
        CGEventSetFlags(event, (flags & CGEventGetFlags(event)));
        CGEventPost(kCGHIDEventTap, event);
        CFRelease(event);

        // Key up event
        event = CGEventCreateKeyboardEvent(source, keyCode, false);
        CGEventSetFlags(event, (flags & CGEventGetFlags(event))); 
        CGEventPost(kCGHIDEventTap, event);
        CFRelease(event);

        CFRelease(source);
    }
}

В настоящее время вывод - hello world1, 1 из того же CGKeyCode, что и '!'. Поэтому я считаю, что мое определение правильной маски флага неверно. Я рассмотрел подобные вопросы, заданные здесь, например:

Получение клавиши-модификатора, нажатой при нажатии CGEvent

CGEventPost - возможная ошибка при имитации событий клавиатуры?

Однако решения там не сработали для меня, если бы кто-нибудь мог помочь мне с тем, где я ошибаюсь, это было бы великолепно!

Спасибо, Крейг


person CraigMetcalfe    schedule 24.04.2014    source источник


Ответы (1)


Для будущих искателей: должно быть (flags | CGEventGetFlags (event)) not & ... другой мудрый сдвиг применяется только в том случае, если сдвиг уже применен.

Что касается определения того, КОГДА следует нажимать сдвиг, ваша функция keyCodeForChar также должна предоставлять эту дополнительную информацию, как это делает VkKeyScan () в Windows.

person Byteboon    schedule 04.11.2016