2012-10-01 56 views
7

問題的兩個部分:在Chrome擴展捕獲Mac的媒體控制鍵

  1. 有沒有一種方法來捕獲(反應於按壓)在Mac鍵盤上的媒體播放控制鍵(上,播放/暫停,下一個)在谷歌瀏覽器擴展使用嚴格的JavaScript?
  2. if (answerToQuestion1 === "no")有沒有辦法使用某種native plugin(C/C++)?

我知道這應該是可能的,因爲Unity Music Media Keys這樣做(儘管我知道他們使用本地插件)。

我已經看了迄今this plugin,聲稱這樣做,但實際上需要FunctionFlip使鍵作爲功能鍵,並響應於推F7F8的F8

回答

8

1 - 都能跟得上= [

2 - 哇 - 哇靠。我之前沒有看到過這個擴展,所以謝謝你。我深入研究了一下,似乎他們在osx上安裝了一個.plugin,而在Windows上則安裝了dll。

反編譯的插件只有幾百行 - https://gist.github.com/3849247

他們使用https://github.com/nevyn/SPMediaKeyTap作爲直接插入介質密鑰的方式(在操作系統x上)。他們通過在端口12345上運行的本地socket.io服務器將其傳遞給瀏覽器,並且該插件正在偵聽在其上觸發的事件。

supppper整齊。

編輯: 這是現在natively supported in chrome

+0

+1感謝您的幫助。我肯定會研究這些。 – Whymarrh

3

最後,我設法完成我在獲得。最終的Chrome擴展程序可以在GitHub上查看。

它是如何工作的?

我最初鏈接到的擴展需要將功能鍵「翻轉」爲實際功能鍵並且沒有特殊用途,但這樣做需要額外的擊鍵才能執行特殊功能(例如控制鍵盤背光,音量等)。

有了很大的幫助,從Patrick's answer,我使用的部件從nevyn/SPMediaKeyTap捕捉延伸和libwebsockets外的按鍵超過解僱他們的擴展:

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

Chrome內,擴展簡單地注入相應的片的JS進入主機頁面:

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