【问题标题】:How to create virtual keyboard in osx?如何在 osx 中创建虚拟键盘?
【发布时间】:2011-05-29 13:35:48
【问题描述】:

我想在 osx 中创建一个虚拟键盘。可能吗?我的意思是我可以制作一个提供与真实键盘相同信号的程序。这种键盘的示例是屏幕键盘或键盘查看器(顺便说一句,它是否具有必要的界面)。

我应该从多低开始?我应该制作设备驱动程序吗?虚拟(无线)键盘?或者可可等有必要的东西吗?

我的要求是:
- 元组列表(时间、key_down/key_up、key_code)对应于输入的人
- 虚拟键盘应与真实键盘并排使用(如触摸板和蓝牙鼠标)
- 这应该适用于每个程序。我能找到的最难的例子是:终端+vim、远程桌面、星际争霸之类的游戏

非常欢迎提供示例代码和链接。

编辑: 要点是对击键进行编程访问。有类似的程序,但它们是封闭源代码(例如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;
}

br,
朱哈

【问题讨论】:

    标签: cocoa macos keyboard driver keyboard-events


    【解决方案1】:

    您可以使用Quartz Event Taps 执行此操作,它提供:

    ...用于事件点击的 C API,它们是 过滤器用于观察和改变 低级用户输入事件流 在 Mac OS X 中

    【讨论】:

      【解决方案2】:

      在 Mac 上,有键盘视图。为什么不能使用它?

      【讨论】:

      • 关键是将击键作为数据(文件、网络流等),而不是鼠标移动。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-31
      • 1970-01-01
      • 1970-01-01
      • 2010-12-31
      • 2015-12-18
      相关资源
      最近更新 更多