Pergunta

Olá pessoal,

Mais uma vez quero beber do conhecimento compartilhado por pessoas que usam SO.

Eu escrevi um pequeno aplicativo para OSX que envia eventos importantes para um aplicativo.Meu alvo é o OSX 10.5.xe mais recente.No entanto, o problema existe quando eu construo para 10.6.x também.Tudo funciona bem, exceto quando envio apenas as teclas modificadoras;Alt, Comando, Controle e Shift.

O problema é que nos dois MacBooks, os eventos das teclas modificadoras parecem ser apagados assim que os testadores movem o cursor usando o mouse ou tocam no touchpad.

Em um desktop com o XCode instalado, tudo funciona bem.Exatamente como deveria.Em dois MacBooks diferentes, o problema ocorre.A área de trabalho possui um teclado padrão de 101 teclas e um mouse com vários botões conectado.
Quando um mouse é conectado aos MacBooks, é usado um mouse de dois botões com roda de rolagem.No entanto, o problema existe quando nenhum periférico está conectado e o touchpad é usado.

O que espero que aconteça é que o evento Modifier Key seja enviado para o aplicativo de destino, o usuário mova o cursor usando o mouse/touchpad, pressione botões no mouse/touchpad e/ou pressione teclas no teclado com o evento modificador key down 'ativo'.Então, quando eles terminam, o evento key up da tecla modificadora é enviado.

Aqui está como estou enviando eventos de tecla pressionada, a tecla Shift para este exemplo:

case ModKeyShiftDown:
    xEventSource = CGEventSourceCreate(kCGEventSourceStatePrivate);
    xTheCommand = CGEventCreateKeyboardEvent(xEventSource, kVK_Shift, true);
    CGEventSetFlags(xTheCommand, kCGEventFlagMaskAlternate);
    CGEventPost(kCGHIDEventTap, xTheCommand);
    //CGEventPost(kCGSessionEventTap, xTheCommand);
    //CGEventPost(kCGAnnotatedSessionEventTap, xTheCommand);
    CFRelease(xTheCommand);
    CFRelease(xEventSource);
break;

Usei todos os três sinalizadores para criar a fonte do evento (kCGEventSourceStatePrivate, kCGEventSourceStateCombinedSessionState e kCGEventSourceStateHIDSystemState).

Eu tentei criar o evento de teclado com a fonte do evento e também nulo como o primeiro parâmetro.

Eu tentei com e sem os sinalizadores apropriados no evento.

Tentei várias combinações de postagem do evento;kCGHIDEventTap, kCGSessionEventTap e kCGAnnotatedSessionEventTap.

Para completar, aqui está como envio um evento up para a tecla Shift:

case ModKeyShiftUp:
    xEventSource = CGEventSourceCreate(kCGEventSourceStatePrivate);
    xTheCommand = CGEventCreateKeyboardEvent(xEventSource, kVK_Shift, false);
    CGEventSetFlags(xTheCommand, 0);
    CGEventPost(kCGHIDEventTap, xTheCommand);
    //CGEventPost(kCGSessionEventTap, xTheCommand);
    //CGEventPost(kCGAnnotatedSessionEventTap, xTheCommand);
    CFRelease(xTheCommand);
    CFRelease(xEventSource);
break;

Quando os testadores acionam um evento de tecla modificadora pressionada, eles podem ver o cursor mudar conforme o esperado.Isso me permite saber que o evento está sendo processado pelo aplicativo de destino.No entanto, assim que tocam no mouse ou no touchpad, o cursor volta a ser um cursor padrão e os eventos do mouse são processados ​​como se nenhum evento de tecla modificadora estivesse ativo.

Gostaria de saber se há algum problema na forma como estou enviando os eventos.Também gostaria de saber se existe uma maneira alternativa de enviar eventos de tecla modificadora que estejam funcionando.

Desculpe se eu exagerei nisso.Minha desculpa é que dormi apenas algumas horas.:P

Obrigado

-isdi-

Foi útil?

Solução

Olá,

Curiosamente, usar AXUIElementRef e AXUIElementPostKeyboardEvent parece funcionar.

Por alguma razão, enviar eventos importantes usando o objeto e método de acessibilidade acima resolve o problema para os testadores.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top