2010-12-22 50 views
1

我想在osx中​​創建一個虛擬鍵盤。可能嗎?我的意思是我可以製作一個能輸出與真實鍵盤相同信號的程序。這種鍵盤的例子是屏幕鍵盤或鍵盤瀏覽器(它是否有必要的接口btw)。如何在osx中​​創建虛擬鍵盤?

我應該啓動多低?我應該製作一個設備驅動程序虛擬(無線)鍵盤?或者可可等有必要的東西?

的要求我已是:
- 元組列表(時間,KEY_DOWN/KEY_UP,key_code)對應於人物打字
- 虛擬鍵盤應該並排以實物攜手並肩(如觸摸屏和藍牙技術的鼠標)
- 這應該適用於每個程序。最難的例子我能找到的是:終端+ vim,遠程桌面,像星際遊戲

示例代碼和鏈接更受歡迎。

編輯:重點是有編程訪問擊鍵。有類似的程序,但它們是閉源的(例如http://www.assistiveware.com/keystrokes.php)。我想知道什麼是製作這種程序的最佳方式。

編輯2:現在我開始了這個派對。下面是一個複製 - 編輯 - 粘貼 - 嘗試 - 其他代碼,基本上包括製作虛擬鍵盤的所有必要部分。在這種情況下,每次按'a'時虛擬鍵盤都會按'z'。有一個bug,有添加了多個「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

你可以做到這一點使用Quartz Event Taps,它提供了:

... C API事件的水龍頭,這是用來觀察和改變低級別的用戶輸入事件 的 流 過濾器在Mac OS X中

+0

優秀!這正是我一直在尋找的。 – Juha 2010-12-22 20:12:45

0

在Mac上,還有就是鍵盤視圖。你爲什麼不能使用它?

+0

關鍵是將鍵擊作爲數據(文件,網絡流等),而不是作爲鼠標移動。 – Juha 2010-12-22 18:09:33