electron-键盘打字小猫吐花学习

前言

用到的库

uiohook-napi

  • 监听键盘,nodejs专用

一些关键

图片设置无法拖动

  • ondragstart="r eturn false;" draggable="false"

设置可拖动元素

  • 默认情况下, 无边框窗口是不可拖拽的。 应用程序需要在 CSS 中指定 -webkit-app-region: drag 来告诉 Electron 哪些区域是可拖拽的(如操作系统的标准标题栏)在可拖拽区域内部使用 -webkit-app-region: no-drag 则可以将其中部分区域排除。

    要使整个窗口可拖拽, 您可以添加 -webkit-app-region: drag 作为 body,html 的样式:

css 复制代码
body,html {
  -webkit-app-region: drag;
}

父通信子

  • 主进程需要去调用渲染进程的方法

    • main.js

      win?.webContents.send('toFlower')

js 复制代码
import Mouse1 from "./assets/闭嘴.png";
import "./App.css"
function App() {
  window.ipcRenderer.on("toFlower",() => {
    alert("调用了我");
  })
  return (
      <img src={Mouse1} className={'miao'} draggable={"false"}/>
  )
}

export default App

窗口穿透

  • 原窗口其实是这样的,如果设置透明而不做其他处理,就会导致被占据的白色这一块下面的元素无法被点击,这种情况就是鼠标穿透的问题
  • 解决代码
    • preload.js
js 复制代码
const electron = require('@electron/remote')
const win = electron.getCurrentWindow();
// 设置指定区域的鼠标点击不穿透
window.addEventListener("mousemove", event => {
    const el = document.getElementById("imgAvatar");
    let flag = event.target === el;
    if (!flag) {
        //允许穿透
        win.setIgnoreMouseEvents(true, {forward: true});
    } else {
        //不允许穿透
        win.setIgnoreMouseEvents(false);
    }
});

requestAnimationFrame

  • requestAnimationFrame是一个浏览器提供的用于执行动画的JavaScript方法。它允许我们按照浏览器的刷新率来调度动画帧,从而实现更加流畅和高效的动画效果。

  • 大多数电脑显示器的刷新频率是 60Hz,大概相当于每秒钟重绘 60 次。大多数浏览器都会对重绘操作加以限制,不超过显示器的重绘频率,因为即使超过那个频率用户体验也不会有提升。因此最平滑动画的最佳循环间隔是1000ms/60,约等于 16.6ms。

    在之前,为了实现动画,常常使用setTimeout()或setInterval()方法来定时更新动画帧。然而,这种方法并不理想,因为它们受限于定时器的精度和浏览器在不同设备上的性能差异。它们的内在运行机制决定了时间间隔参数实际上只是指定了把动画代码添加到浏览器 UI 线程队列中以等待执行的时间。如果队列前面已经加入了其他任务,那动画代码就要等前面的任务完成后再执行

    requestAnimationFrame的出现解决了这个问题。它使用浏览器的刷新率作为参考,确保动画帧的更新在每一帧之间的间隔是最佳的,从而实现更加流畅和自然的动画效果。

  • 具体看这位博主的,写的很好

    • https://zhuanlan.zhihu.com/p/600296111
    • window.requestAnimationFrame(callbackFn)默认只会执行一次,就是说cancelAnimationFrame基本上用不到,代码中的继续执行是使用递归的形式,持续调用才会继续执行,当距离左侧超过720像素时,不去递归调用了,就停下来了。不像setInterval需要注意清除的时机

问题

开启-webkit-app-region后可以右键了

  • 小猫开启-webkit-app-region:drag后,会发现可以右键了

main.js添加下面代码

js 复制代码
  //关闭因为css: -webkit-app-region: drag;   引起的默认鼠标右键菜单
  //这里是关闭这个鼠标右键功能
  win.hookWindowMessage(278,function(_){
    win?.setEnabled(false);//窗口禁用
    setTimeout(()=>{
      win?.setEnabled(true);//窗口启用
    },100);
    return true;
  })

巧妙的点

  • 在body,html上设置了justify-content:end,align-items:end,display:flex,这样就可以让小猫在右下角集合,同时设置花朵起始坐标的时候,设置为负数,这样就可以将原本很难定位的猫嘴位置进行确定了

    • 因为如果你设置了猫右下角,如果花朵需要出现在猫嘴,就需要结合窗口高度,宽度来决定translate的偏移量,通过这种方法,只需要根据猫的大小来确定了
  • 顺带一提,transform:translate是根据原有位置的坐标来决定起始位置的

相关推荐
2301_795167206 分钟前
昇思25天学习打卡营第9天|MindSpore使用静态图加速(基于context的开启方式)
网络·人工智能·学习
骑驴闯天涯40 分钟前
JAVA学习笔记-JAVA基础语法-DAY24-Stream流、方法引用
笔记·学习
fensioakq—qqq1 小时前
Spring框架的学习SpringMVC(1)
java·开发语言·后端·学习·spring
小李很执着2 小时前
【掌握C++ string 类】——【高效字符串操作】的【现代编程艺术】
开发语言·c++·后端·学习
leesan快点跑3 小时前
昇思25天学习打卡营第13天|sea_fish
学习
子龙烜3 小时前
Pandas 学习笔记(四)--CSV文件
笔记·学习·数据分析·pandas·csv·python数据可视化
街 三 仔3 小时前
【LabVIEW学习篇 - 4】:程序结构——条件结构、事件结构、禁用结构
学习·labview
泡芙冰淇淋ya3 小时前
【redis】redis知识点学习目录整理及简介
数据库·redis·学习
Java追光着3 小时前
谷粒商城学习笔记-逆向工程错误记录
笔记·学习·谷粒商城
前端基地4 小时前
昇思25天学习打卡营第6天|关于函数与神经网络梯度相关技术探讨
人工智能·python·深度学习·神经网络·学习·机器学习·ai编程