2012-10-01 6 views
7

Due domanda parte:Capture Mac tasti di controllo multimediale in un'estensione Chrome

  1. C'è un modo per catturare (reagire alla pressione dei) i tasti di controllo della riproduzione dei media su una tastiera Mac (precedente, play/pausa , successivamente) in un'estensione di Google Chrome utilizzando rigorosamente JavaScript?
  2. if (answerToQuestion1 === "no") c'è un modo per farlo usando una sorta di native plugin (C/C++)?

So che questo dovrebbe essere possibile, come lo fa Unity Music Media Keys (anche se so che stanno usando un plugin nativo).

Quello che ho guardato finora è this plugin, che pretende di farlo, ma in realtà richiede FunctionFlip per rendere i tasti fungono da tasti funzione, e reagisce alla pressione del F7, F8 e F8.

risposta

8

1 - no = [

2 - Whoa - holy crap. Non avevo mai visto questa estensione prima, quindi grazie per quello. L'ho scavato un po ', e sembra che installino un .plugin su osx e una dll per il supporto di windows.

Il plug-in decompilato è solo un paio di centinaia di righe - https://gist.github.com/3849247.

Utilizzano https://github.com/nevyn/SPMediaKeyTap come un modo per collegarsi direttamente ai tasti multimediali (su os x). Lo inoltrano tramite un server socket.io locale in esecuzione sulla porta 12345 al browser e il plug-in ascolta gli eventi attivati ​​su di esso.

n.

EDIT: Questo è ora natively supported in chrome

+0

+1 Grazie per l'aiuto. Di sicuro starò a guardare questi. – Whymarrh

3

Alla fine sono riuscito a realizzare quello che mi è stato sempre a. L'estensione Chrome finale può essere visualizzata su GitHub.

Come funziona?

L'estensione originariamente collegata a richiedeva che i tasti funzione fossero "capovolti" per essere effettivamente tasti funzione e non avevano uno scopo speciale, ma per farlo è necessario un ulteriore tasto per eseguire le funzioni speciali (come il controllo della retroilluminazione della tastiera , volume, ecc.).

Con grande aiuto da Patrick's answer, ho usato le parti da nevyn/SPMediaKeyTap per catturare i tasti premuti fuori l'estensione e libwebsockets a sparare loro oltre alla estensione:

- (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); 
    } 
} 

All'interno Chrome, l'estensione inietta semplicemente il pezzo appropriata di JS nella pagina 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(); 
     }); 
    } 
};