Pergunta

Estou tentando usar torneiras de eventos para criar um programa OS X que ouvirá o iídiche digitado em transliteração e publicar o resultado em caracteres hebraicos. Fiz um programa muito curto para testar uma coisa que eu teria que fazer: http://pastie.org/791398

Como está, o programa substitui com sucesso todos os 'Q' digitados por 'W':

if(inputString[0] == 'q') { inputString[0] = 'w'; }

Mas como se publica uma sequência de mais de um personagem? Por exemplo, se alguém digitar 'sh', você presumivelmente teria que postar um backspace (para excluir o personagem que foi publicado apenas para 'S') e depois postar o personagem que corresponde a 'sh'. No entanto, esse código resulta em apenas um backspace sendo publicado:

else if(inputString[0] == 'm') { inputString[0] = '\b'; inputString[1] = 'n'; }

Peço desculpas se essas são perguntas básicas; Eu li toda a documentação que pude encontrar, mas talvez não tenha entendido tudo. Também é possível que eu esteja fazendo isso inteiramente da maneira errada.

Foi útil?

Solução

Idealmente, você deve estar usando um método de entrada em vez de um programa com torneiras de eventos, provavelmente usando Kit de método de entrada Se você não precisar suportar pré-10.5. O uso de torneiras de eventos para esse fim é inerentemente uma má idéia, porque o usuário pode alterar onde está digitando com o mouse e o teclado. Portanto, se o usuário digitar um "s" em um campo de texto seguido por um "h" em outro, você não seria capaz de dizer a diferença.

Dito isto, aqui está uma resposta direta à sua pergunta.

A corda é montada em comprimento, para que você não possa simplesmente fornecer o comprimento de entrada (1); O segundo personagem será ignorado. No entanto, a maioria dos aplicativos também não gosta de obter mais do que um único caractere por evento, então eles apenas descartam os caracteres restantes. (Terminal é uma exceção notável.)

Então, o que você pode fazer é simplesmente postar um segundo evento com o segundo personagem.

else if(inputString[0] == 'm') {
  inputString[0] = 'n';
  CGEventKeyboardSetUnicodeString(event, 1, inputString);
  CGEventPost(kCGSessionEventTap, event);
  inputString[0] = '\b';
}

No caso geral (simulando> 2 tensões), você precisará criar um evento para cada caractere que deseja inserir. Esta postagem da lista de discussão Inclui um exemplo simples.

Outras dicas

É assim que envio uma string para o primeiro respondedor (aplicação em primeiro plano)

// 1 - Get the string length in bytes.        
NSUInteger l = [string lengthOfBytesUsingEncoding:NSUTF16StringEncoding];

// 2 - Get bytes for unicode characters
UniChar *uc = malloc(l);
[string getBytes:uc maxLength:l usedLength:NULL encoding:NSUTF16StringEncoding options:0 range:NSMakeRange(0, l) remainingRange:NULL];

// 3 - create an empty tap event, and set unicode string
CGEventRef tap = CGEventCreateKeyboardEvent(NULL,0, YES);
CGEventKeyboardSetUnicodeString(tap, string.length, uc);

// 4 - Send event and tear down
CGEventPost(kCGSessionEventTap, tap);
CFRelease(tap);
free(uc);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top