Я хочу создать виртуальную клавиатуру в 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