我想在osx中创建一个虚拟键盘。可能吗?我的意思是我可以制作一个程序,提供与真实键盘相同的信号。这种键盘的例子是屏幕键盘或键盘查看器(它有必要的接口btw)。
我应该开始多低?我应该制作一个设备驱动程序吗虚拟(无线)键盘?或者可可等有必要的东西吗?
我的要求是:
- 元组列表(time,key_down / key_up,key_code)对应于打字的人
- 虚拟键盘应与真实键盘(如触摸板和蓝牙鼠标)并排工作
- 这应该适用于每个程序。我能找到的最难的例子是:终端+ vim,远程桌面,像星际争霸这样的游戏
示例代码和链接非常受欢迎。
编辑:重点是以编程方式访问击键。有类似的程序,但它们是封闭源(例如http://www.assistiveware.com/keystrokes.php)。我想知道制作这种程序的最佳方法是什么。
编辑2:现在我开始了这个派对。下面是一个copy-edit-paste-try-something-else代码,它基本上包含了制作虚拟键盘所需的所有部分。在这种情况下,每次按'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,
尤哈
答案 0 :(得分:1)
您可以使用Quartz Event Taps执行此操作,其中提供了:
...用于事件点击的C API,它们是 过滤器用于观察和改变 低级用户输入事件流 在Mac OS X中
答案 1 :(得分:0)
在Mac上,有键盘视图。为什么你不能使用它?