Смысл состоит в том, чтобы назначать нажатия клавиш как данные (файл, сетевой поток и т. Д.), А не как движение мыши.

у создать виртуальную клавиатуру в OSX. Является ли это возможным? Я имею в виду, могу ли я сделать программу, которая дает те же сигналы, что и настоящая клавиатура. Примером клавиатуры такого типа может служить экранная клавиатура или средство просмотра клавиатуры (между прочим, есть ли у нее необходимый интерфейс).

Как низко я должен начать? Должен ли я сделать драйвер устройства, например виртуальная (беспроводная) клавиатура? Или у какао и т. Д. Есть необходимые вещи?

У меня есть следующие требования:
- список кортежей (time, key_down / key_up, key_code) соответствует типу лица
- виртуальная клавиатура должна работать бок о бок с реальной (как тачпад и мышь bluetooh)
- это должно работать с каждой программой. Самые сложные примеры, которые я могу найти: Terminal + vim, удаленный рабочий стол, такие игры, как starcraft

Пример кода и ссылки более чем приветствуются.

редактировать: Главное - иметь программный доступ к нажатию клавиш. Есть подобные программы, но они с закрытым исходным кодом (например,http://www.assistiveware.com/keystrokes.php). Я хочу знать, каков наилучший способ сделать такую ​​программу.

редактировать 2: Теперь я начал эту вечеринку. Ниже приведен код копирования-редактирования-вставки-попытки-чего-то еще, который в основном включает в себя все необходимые части для создания виртуальной клавиатуры. В этом случае каждый раз, когда я нажимаю «a», виртуальная клавиатура нажимает «z». Существует ошибка, что добавлено несколько символов z ...

#import <ApplicationServices/ApplicationServices.h>

CGEventRef myCGEventCallback(CGEventTapProxy proxy, CGEventType type,  CGEventRef event, void *refcon) {

    UniChar unicodeString[101];
    UniCharCount unicharCount; 
    char chars[2];
    int i,j,charsLen;

    CGEventRef zDown;
    CGEventRef zUp;
    zDown = CGEventCreateKeyboardEvent (NULL, (CGKeyCode)6, true);
    zUp = CGEventCreateKeyboardEvent (NULL, (CGKeyCode)6, false);

    //printf("%u %u\n", (uint32_t)type, (uint32_t) event);

    CGEventKeyboardGetUnicodeString(event, 100, &unicharCount, unicodeString);

    for (i=0; i < unicharCount; i++)
    {
        if (unicodeString[i] > 127) {
            chars[0] = (unicodeString[i] >> 8) & (1 << 8) - 1;
            chars[1] = unicodeString[i] & (1 << 8) - 1; 
            charsLen = 2;
        } else {
            charsLen = 1;
            chars[0] = unicodeString[i];
        }
        //for (j = 0; j < charsLen; j++) printf("%c", chars[j]);
    }

    if (chars[0] == 'a')
    {
        CGEventPost(kCGHIDEventTap, zDown);
        CGEventPost(kCGHIDEventTap, zUp);
    }

    return event; 
}

int main (int argc, const char * argv[]) {
    CFMachPortRef eventTap;  
    CFRunLoopSourceRef runLoopSource; 

    eventTap = CGEventTapCreate(kCGSessionEventTap, kCGHeadInsertEventTap, 0, kCGEventMaskForAllEvents, myCGEventCallback, NULL);
    runLoopSource = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, eventTap, 0);
    CFRunLoopAddSource(CFRunLoopGetCurrent(), runLoopSource, kCFRunLoopCommonModes);
    CGEventTapEnable(eventTap, true);
    CFRunLoopRun();

    return 0;
}

ш,
Юха

Ответы на вопрос(1)

Ваш ответ на вопрос