两部分问题:
if (answerToQuestion1 === "no")
有没有办法使用某种native plugin (C / C ++)?我知道这应该是可能的,正如Unity Music Media Keys所做的那样(虽然我知道他们使用的是原生插件)。
到目前为止,我所看到的是this plugin,声称这样做,但实际上需要FunctionFlip才能使键充当功能键,并对按下做出反应F7 , F8 和 F8 。
答案 0 :(得分:8)
1 - nope = [
2 - 哇 - 圣洁的废话。我以前没见过这个扩展,所以谢谢你。我挖了一下,似乎他们在osx上安装了一个.plugin,并为windows支持安装了一个dll。
反编译的插件只有几百行 - https://gist.github.com/3849247。
他们使用https://github.com/nevyn/SPMediaKeyTap作为直接插入媒体密钥的方法(在os x上)。他们通过在端口12345上运行的本地socket.io服务器将其传递给浏览器,并且插件正在侦听在其上触发的事件。
supppper整洁。
编辑: 现在是natively supported in chrome
答案 1 :(得分:4)
最终我设法完成了我的目标。最终的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();
});
}
};