Greasy Fork镜像 支持简体中文。

Your Show

Display the mouse position and pressed keys.

  1. // ==UserScript==
  2. // @name Your Show
  3. // @name:zh-CN 演示助手
  4. // @description Display the mouse position and pressed keys.
  5. // @description:zh-CN 显示鼠标位置和按下的按键。
  6. // @namespace https://gf.qytechs.cn/users/197529
  7. // @version 0.1.9
  8. // @author kkocdko
  9. // @license Unlicense
  10. // @match *://*/*
  11. // ==/UserScript==
  12. "use strict";
  13.  
  14. const host = document.body.appendChild(document.createElement("your-show"));
  15. document.addEventListener("fullscreenchange", () => {
  16. (document.fullscreenElement || document.body).appendChild(host);
  17. });
  18. const root = host.attachShadow({ mode: "open" });
  19. const css = ([s]) => `<style>${s}</style>`;
  20. root.innerHTML = css`
  21. :host {
  22. position: fixed;
  23. z-index: 2147483647;
  24. }
  25. your-mouse {
  26. display: block;
  27. position: fixed;
  28. z-index: 2147483647;
  29. width: 30px;
  30. height: 30px;
  31. left: 0;
  32. top: 0;
  33. background: #3f51b5a9;
  34. border-radius: 50%;
  35. /* transition: transform 0.2s 0.06s; */
  36. user-select: none;
  37. pointer-events: none;
  38. border-top-left-radius: 0;
  39. }
  40. div {
  41. position: fixed;
  42. top: 16px;
  43. right: 16px;
  44. z-index: 2147483647;
  45. font-size: 20px;
  46. text-shadow: 1px 1px #fff, 1px -1px #fff, -1px 1px #fff, -1px -1px #fff;
  47. user-select: none;
  48. pointer-events: none;
  49. font-family: monospace;
  50. }
  51. span {
  52. line-height: 2;
  53. padding: 0 0.5em;
  54. margin: 4px;
  55. display: inline-block;
  56. box-shadow: 0 1px 5px 1px #888;
  57. border-radius: 8px;
  58. background: #fff;
  59. color: #000;
  60. }
  61. `;
  62. {
  63. const mouseEl = root.appendChild(document.createElement("your-mouse"));
  64. const mouseStyle = mouseEl.style;
  65. addEventListener("pointermove", (e) => {
  66. mouseStyle.transform = "translate(" + e.clientX + "px," + e.clientY + "px)";
  67. });
  68. }
  69. {
  70. // <div><span>Ctrl</span> + <span>M</span></div>
  71. // <div><span>Shift</span> + <span>U</span></div>
  72. // keyboard layout
  73. const serial = new Map(); // (code, stamp)
  74. const div = root.appendChild(document.createElement("div"));
  75. const names = {};
  76. for (const c of [...Array(13).keys()]) names[`F${c}`] = `F${c}`;
  77. for (const c of [...Array(10).keys()]) names[`Digit${c}`] = c;
  78. for (const c of [...Array(26).keys()].map((v) => String.fromCharCode(v + 65)))
  79. names[`Key${c}`] = c;
  80. names.ControlLeft = names.ControlRight = "Ctrl";
  81. names.ShiftLeft = names.ShiftRight = "Shift";
  82. names.AltLeft = names.AltRight = "Alt";
  83. names.BracketRight = "]";
  84. names.BracketLeft = "[";
  85. names.Semicolon = ";";
  86. names.Slash = "/";
  87. names.Backslash = "\\";
  88. names.Backquote = "`";
  89. names.Minus = "-";
  90. names.Equal = "=";
  91. names.Quote = "'";
  92. names.Comma = ",";
  93. names.Period = ".";
  94. // https://symbl.cc/cn/unicode/blocks/miscellaneous-symbols-and-arrows/
  95. // names.ArrowUp = "↑";
  96. // names.ArrowDown = "↓";
  97. // names.ArrowLeft = "←";
  98. // names.ArrowRight = "→";
  99. const refresh = () => {
  100. const pressed = [
  101. ...new Set(
  102. [...serial.keys()].map((v) => {
  103. if (!names[v]) {
  104. names[v] = v;
  105. console.log(`showkeydown: unknown key [ ${v} ]`);
  106. }
  107. return names[v];
  108. })
  109. ).values(),
  110. ];
  111. div.innerHTML = pressed.length
  112. ? pressed.map((name) => `<span>${name}</span>`).join(" ")
  113. : "";
  114. };
  115. addEventListener("keydown", ({ code }) => {
  116. serial.set(code, Date.now());
  117. refresh();
  118. });
  119. addEventListener("keyup", ({ code }) => {
  120. serial.delete(code);
  121. refresh();
  122. });
  123. }

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址