torneiras de eventos: resultados variando com CGEventPost, kCGSessionEventTap, kCGAnnotatedSessionEventTap, CGEventTapPostEvent

StackOverflow https://stackoverflow.com/questions/553284

Pergunta

Eu estou correndo em um problema espinhoso com a publicação de um evento a partir de uma torneira evento. Estou tocando para NSSystemDefined em kCGHIDEventTap, em seguida, substituindo o evento com um novo. O problema que eu estou correndo para é que dependendo de como eu postar o evento, está sendo visto apenas por alguns aplicativos. Meus aplicações de teste são Opera, Firefox, Quicksilver, e Xcode. Aqui estão as diferentes técnicas que eu tentei dentro do meu evento torneira de retorno de chamada, com resultados. Estou esperando uma ação (a "resposta correta") de cada aplicativo; "Beep do sistema" significa o nada-é-bound-se que-chave som do sistema.

  1. Criar um novo evento, e devolvê-lo a partir do retorno de chamada. Opera: no beep resposta / sistema, o Firefox: no beep resposta / sistema, Quicksilver: resposta correta, Xcode: não beep resposta / sistema

  2. Criar um novo evento, pós para kCGSessionEventTap com CGEventPost, return null. Opera: no beep resposta / sistema, o Firefox: no beep resposta / sistema, Quicksilver: resposta correta, Xcode: não beep resposta / sistema

  3. Criar um novo evento, pós para kCGAnnotatedSessionEventTap com CGEventPost, return null. Opera: resposta correta, Firefox: resposta correta, Quicksilver: não beep resposta / sistema, Xcode: não beep resposta / sistema

  4. Criar um novo evento, post com CGEventTapPostEvent, return null. Opera: no beep resposta / sistema, o Firefox: no beep resposta / sistema, Quicksilver: resposta correta, Xcode: não beep resposta / sistema

  5. Criar um novo evento, pós para kCGSessionEventTap com CGEventPost, e voltar novo evento. Opera: no beep resposta / sistema, o Firefox: no beep resposta / sistema, Quicksilver: resposta correta, Xcode: não beep resposta / sistema

  6. Criar um novo evento, pós para kCGAnnotatedSessionEventTap com CGEventPost, e voltar novo evento. Opera: resposta correta e sistema de aviso sonoro, Firefox: resposta correta e sinal sonoro do sistema, Quicksilver: resposta correta e sinal sonoro do sistema, Xcode: não beep resposta / duplo sistema

  7. Criar um novo evento, post com CGEventTapPostEvent, e voltar novo evento. Opera: no beep resposta / sistema, o Firefox: no beep resposta / sistema, Quicksilver: resposta correta, Xcode: não beep resposta / sistema

(6) é o melhor, mas os usuários estão reclamando sobre o sinal sonoro do sistema extra sobre as respostas corretas, o que eu estou supondo que está vindo do duplo postagem do evento. Eu não tenho certeza de outras combinações para tentar, ou mais onde procurar. Alguém pode oferecer qualquer orientação? Existe alguma maneira de obter os resultados de ambos retornando o evento do meu retorno e postagem para a torneira anotada sem fazer tanto?

Desculpem a longa questão; Eu tenho feito um monte de experimentar.

Agradecemos antecipadamente


Update: este é o código que usei para criar a torneira evento:

CFMachPortRef eventTap;
eventTap = CGEventTapCreate(kCGHIDEventTap, kCGHeadInsertEventTap, 0,CGEventMaskBit(NX_SYSDEFINED) | (1 << kCGEventKeyDown) | (1 << kCGEventKeyUp), myCGEventCallback, (void *)hidEventQueue);
Foi útil?

Solução

Eu acho que eu reparei isso. Eu estava usando +[NSEvent keyEventWithType:location:modifierFlags:timestamp:windowNumber:context:characters:charactersIgnoringModifiers:isARepeat:keyCode:] para criar um NSEvent, em seguida, retornar -CGEvent desse evento. Mudei para CGEventCreateKeyboardEvent, usando a fonte de evento criado a partir do evento original com CGEventCreateSourceFromEvent, e retornando o evento a partir do retorno de chamada. Todos os meus testes passam agora.

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