CGEventSetFlags - Открийте кога се изисква ключ за модификатор на shift от локален низ

това е първата ми публикация, така че, моля, уведомете ме, ако нещо има нужда от редактиране.

В момента имам функция, която ще върне кода на виртуалния клавиш на клавиатура на Apple, като й предаде char; 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)


За бъдещи търсачи: Трябва да бъде (флагове | CGEventGetFlags(събитие)) не & ... друго разумно преместване се прилага само ако вече е приложено преместване.

Що се отнася до определянето КОГА трябва да се натисне shift, вашата функция keyCodeForChar също трябва да предоставя тази допълнителна информация, подобно на VkKeyScan() в Windows.

person Byteboon    schedule 04.11.2016