7

两部分问题:

  1. 有没有办法使用严格的 JavaScript 在 Google Chrome 扩展程序中捕获(对按下)Mac 键盘上的媒体播放控制键(上一个、播放/暂停、下一个)?
  2. if (answerToQuestion1 === "no")有没有办法使用某种本机插件(C/C++)来做到这一点?

我知道这应该是可能的,正如Unity Music Media Keys所做的那样(尽管我知道他们使用的是本机插件)。

到目前为止,我看到的是这个插件,它声称可以这样做,但实际上需要FunctionFlip使按键充当功能键,并对按下F7F8F8.

4

2 回答 2

8

1 - 不 = [

2 - 哇 - 废话。我以前没见过这个扩展,所以谢谢你。我深入研究了一下,似乎他们在 osx 上安装了一个 .plugin 和一个用于 Windows 支持的 dll。

反编译的插件只有几百行 - https://gist.github.com/3849247

他们使用https://github.com/nevyn/SPMediaKeyTap作为直接插入媒体密钥(在 os x 上)的一种方式。他们通过在端口 12345 上运行的本地 socket.io 服务器将其中继到浏览器,并且插件正在侦听在其上触发的事件。

宵夜整洁。

编辑:这现在在 chrome 中原生支持

于 2012-10-07T19:05:20.170 回答
4

最终,我设法完成了我的目标。最终的 Chrome 扩展可以在GitHub 上看到。

它是如何工作的?

我最初链接到的扩展要求功能键“翻转”实际上是功能键并且没有特殊用途,但这样做需要额外的击键才能执行特殊功能(例如控制键盘背光、音量等)。

Patrick 的回答的大力帮助下,我使用了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();
        });
    }
};
于 2013-09-07T20:56:26.370 回答