2010-12-22 5 views
1

Je veux créer un clavier virtuel dans osx. C'est possible? Je veux dire que je peux faire un programme qui donne les mêmes signaux que le vrai clavier. Exemple de ce type de clavier serait le clavier à l'écran, ou visionneuse keybord (a-t-il l'interface nécessaire btw).Comment créer un clavier virtuel dans osx?

De combien devrais-je commencer? Devrais-je créer un pilote de périphérique, par exemple? clavier virtuel (sans fil)? Ou est-ce que le cacao etc. a les choses nécessaires?

Les exigences que j'ai sont:
- une liste de tuples (temps, key_down/KEY_UP, key_code) correspond à une personne en tapant
- clavier virtuel doit travailler côte à côte avec le vrai (comme pavé tactile et la souris Bluetooh
- Cela devrait fonctionner avec tous les programmes. Les exemples les plus difficiles que je puisse trouver sont: Terminal + vim, bureau à distance, jeux comme starcraft

Les exemples de code et les liens sont plus que bienvenus.

edit: Le point principal est d'avoir un accès par programme aux frappes. Il existe des programmes similaires, mais ils sont à source fermée (par exemple http://www.assistiveware.com/keystrokes.php). Je veux savoir quelle est la meilleure façon de faire ce genre de programme.

éditer 2: Maintenant, j'ai commencé cette fête. Ci-dessous se trouve un code copy-edit-paste-try-something-else qui inclut essentiellement toutes les parties nécessaires pour créer un clavier virtuel. Dans ce cas, chaque fois que j'appuie sur 'a', le clavier virtuel appuie sur 'z'. Il y a un bug, qu'il ya plusieurs « z est ajoutée ...

#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

Répondre

0

Vous pouvez le faire en utilisant Quartz Event Taps, qui fournit un:

... API C pour les robinets d'événements, qui sont filtres utilisés pour observer et modifier le flux d'événements d'entrée utilisateur bas niveau sous Mac OS X

+0

excellent! C'était exactement ce que je cherchais. – Juha

0

Sur Mac, il y a la vue du clavier. Pourquoi ne peux-tu pas utiliser ça?

+0

Le but est de donner les frappes en tant que données (fichier, flux réseau, etc.), pas en tant que mouvement de la souris. – Juha