2012-10-01 12 views
7

Dos pregunta parte:captura de Mac teclas de control multimedia en una extensión de Chrome

  1. ¿Hay una manera de capturar (reaccionar a la pulsación de) las teclas de control de reproducción de medios de comunicación en un teclado Mac (anterior, reproducir/pausa , a continuación) en una extensión de Google Chrome utilizando estrictamente JavaScript?
  2. if (answerToQuestion1 === "no") ¿hay alguna manera de hacerlo usando algún tipo de native plugin (C/C++)?

Sé que esto debería ser posible, como lo hace Unity Music Media Keys (aunque sé que están usando un plugin nativo).

Lo que he visto hasta ahora es this plugin, que pretende hacerlo, pero en realidad requiere FunctionFlip para hacer las teclas actúan como teclas de función, y reacciona a la pulsación de F7,F8, y F8.

Respuesta

8

1 - pues no = [

2 - Whoa - santo basura. No había visto esta extensión antes, así que gracias por eso. Investigué un poco, y parece que instalan un .plugin en osx y un dll para el soporte de Windows.

El complemento descompilado solo tiene un par de cientos de líneas: https://gist.github.com/3849247.

Están utilizando https://github.com/nevyn/SPMediaKeyTap como una forma de conectarse directamente a las teclas multimedia (en os x). Están retransmitiendo eso a través de un servidor socket.io local que se ejecuta en el puerto 12345 al navegador, y el complemento está escuchando eventos activados en él.

supppper neat.

EDIT: Esto es ahora natively supported in chrome

+0

+1 Gracias por la ayuda. Estoy seguro de que los investigaré. – Whymarrh

3

Finalmente me las arreglé para lograr lo que quería llegar. La última extensión de Chrome se puede ver en GitHub.

¿Cómo funciona?

La extensión a la que originalmente me vinculé requería que las teclas de función fueran "volteadas" para ser realmente teclas de función y no tener un propósito especial, pero hacerlo requiere una pulsación adicional para realizar las funciones especiales (como controlar las retroiluminaciones del teclado , volumen, etc.).

Con gran ayuda de Patrick's answer, que utiliza piezas de nevyn/SPMediaKeyTap para capturar las pulsaciones de teclas fuera de la extensión y libwebsockets a despedirlos a la extensión:

- (void) handleKeyCode: (int) kcode withKeyState: (int) kstate 
{ 
    if (kstate) { 
     return; // keydown 
    } 
    // keyup 
    int len = 1; 
    unsigned char data[LWS_SEND_BUFFER_PRE_PADDING + len + LWS_SEND_BUFFER_POST_PADDING]; 
    data[LWS_SEND_BUFFER_PRE_PADDING] = kcode; 
    for (int i = 0; i < num_clients; i++) { 
     libwebsocket_write(clients[i], &data[LWS_SEND_BUFFER_PRE_PADDING], len, LWS_WRITE_TEXT); 
     NSLog(@"Sent %d", kcode); 
    } 
} 

Dentro de Chrome, la extensión simplemente inyecta la pieza apropiada de JS en la página de host:

this.onmessage = function (message) { 
    var keyCode = message.data.charCodeAt(0); 
    if (keyCode === 20) { 
     inject(function() { 
      window.R.player.previous(); 
     }); 
    } 
    if (keyCode === 16) { 
     inject(function() { 
      window.R.player.playPause(); 
     }); 
    } 
    if (keyCode === 19) { 
     inject(function() { 
      window.R.player.next(); 
     }); 
    } 
}; 
Cuestiones relacionadas