Как создать виртуальную клавиатуру в OSX? - PullRequest
1 голос
/ 22 декабря 2010

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

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

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

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

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

edit 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;
}

br,
Juha

Ответы [ 2 ]

1 голос
/ 22 декабря 2010

Вы можете сделать это, используя Quartz Event Taps , который обеспечивает:

... C API для событий, которые являются фильтрами, используемыми для наблюдения и изменения потока.низкоуровневых событий пользовательского ввода в Mac OS X

0 голосов
/ 22 декабря 2010

На Mac есть вид клавиатуры.Почему ты не можешь использовать это?

...