通过Greasemonkey向窗口发送一个箭头键事件



我想做一个简单的脚本来重新映射WASD键发送上/左/下/右键事件到窗口。我用的是最新版本的Firefox和Greasemonkey。

这是我现在的脚本,我已经尝试了它的许多变体,加上我在网上找到的一些其他方法。没有作品。

// ==UserScript==
//
// @grant          unsafeWindow
//
// ==/UserScript==
function KeyCheck(e)
{
  //alert(e.keyCode);
  var key = 0;
  if (e.keyCode == 87) 
  {
    key = 38;
  }
  else if (e.keyCode == 65)
  {
    key = 37;
  }
  else if (e.keyCode == 83)
  {
    key = 40;
  }
  else if (e.keyCode == 68)
  {
    key = 39;
  }
    var ev = document.createEvent ('KeyboardEvent');
    ev.initKeyEvent('keypress', true, true, window, false, false, false, false, key, key);
  unsafeWindow.dispatchEvent(ev);
}
unsafeWindow.addEventListener('keydown', KeyCheck, true);

所有我需要的是一个简单的函数,可以成功地发布一个关键事件到窗口或文档。手动滚动页面在这里不是一个选项(因为我想确保可能在检测箭头键的页面上运行的其他脚本被触发)

好的——我想到了一个办法。

在Firefox和GreaseMonkey下测试——我没有在Chrome下测试。

编辑在Chrome和TamperMonkey下测试。按键也被注册了。我不相信普通的内置Chrome用户脚本有不安全的窗口,他们更有限。

简而言之,代码不能作为用户脚本使用。

因此,我们欺骗系统,将用户脚本转换为常规脚本并将其注入页面本身。

现在,它实际上不工作和滚动-但它确实捕获关键事件并抛出警报。

<<p> 编辑:笔记/strong>

根据我的经验,GreaseMonkey非常偏执,会让任何东西意外地从不安全的窗口滑到非常沙盒和受保护的用户脚本世界。

事件,特别是,有点棘手。注册到unsafeWindow的事件不能也不会回泡到GreaseMonkey——这给我带来了不小的痛苦。

// ==UserScript==
//
// @grant          unsafeWindow
// @include   http://*/*
// @include   https://*/*
//
// ==/UserScript==

var head = unsafeWindow.document.getElementsByTagName('head') [0],
script = unsafeWindow.document.createElement('script');
// The magic is here.
// We turn the script into a string which will get parsed be the JS compiler
// when it is added to the unsafeWindow.document.
var scriptTxt = '(' + fn + ')()';
script[script.innerText ? 'innerText' : 'textContent'] = scriptTxt;
head.appendChild(script);
// This is just a wrapper to hold things.    
function fn() {
  function KeyCheck(e)
  {
    alert(e.keyCode);
    var key = 0;
    if (e.keyCode == 87)
    {
      key = 38;
    } 
    else if (e.keyCode == 65)
    {
      key = 37;
    } 
    else if (e.keyCode == 83)
    {
      key = 40;
    } 
    else if (e.keyCode == 68)
    {
      key = 39;
    }
    var ev = document.createEvent('KeyboardEvent');
    ev.initKeyEvent('keypress', true, true, window, false, false, false, false, key, key);
    window.dispatchEvent(ev);
  }
  window.addEventListener('keydown', KeyCheck, true);
};

最新更新