Смысл состоит в том, чтобы назначать нажатия клавиш как данные (файл, сетевой поток и т. Д.), А не как движение мыши.
у создать виртуальную клавиатуру в 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;
}
ш,
Юха