依星源码资源网,依星资源网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 10|回复: 0

electron 监听键盘事件

[复制链接] 主动推送

9282

主题

9334

帖子

9974

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
9974
发表于 昨天 09:35 | 显示全部楼层 |阅读模式
electron 监听键盘事件
1. electron 键盘事件监听
electron 中可以使用globalShortcut监听键盘事件,具体可以查看 electron 官方文档,有详细的介绍

注册事件:globalShortcut.register
判断是否注册成功:globalShortcut.isRegistered
注销注册事件:globalShortcut.unregisterAll

在 main.js 主进程文件中进行注册操作,具体代码如下所示:
  1. const { globalShortcut } = require("electron");

  2. const createWindow = () => {
  3.   const win = new BrowserWindow({});
  4.   // 在创建窗口时,注册键盘事件
  5.   handleRegister();
  6. };

  7. const handleRegister = () => {
  8.   // 注册一个'Up'监听器
  9.   globalShortcut.register("Up", () => {
  10.     // 发送消息通知
  11.     win.webContents.send("move-up");
  12.   });
  13.   // 检查'Up'是否注册成功
  14.   console.log("键盘上注册成功", globalShortcut.isRegistered("Up"));

  15.   globalShortcut.register("Down", () => {
  16.     // 发送消息通知
  17.     win.webContents.send("move-down");
  18.   });
  19.   // 检查'down'是否注册成功
  20.   console.log("键盘下注册成功", globalShortcut.isRegistered("Down"));
  21. };

  22. app.whenReady().then(() => {
  23.   // 调用该函数来打开窗口
  24.   createWindow();

  25.   app.on("activate", () => {
  26.     if (BrowserWindow.getAllWindows().length === 0) createWindow();
  27.   });
  28. });

  29. app.on("will-quit", () => {
  30.   // 在应用即将退出时,注销所有快捷键,以避免内存泄漏
  31.   globalShortcut.unregisterAll();
  32. });
复制代码
2. react 接受事件通知
electron 键盘事件注册后,需要在 react 页面中进行监听,如下创建了一个 useKeyboardController.tsx 进行统一处理
将键盘控制逻辑封装在了自定义的 hooks 中
它接受两个参数:handleMoveUp 和 handleMoveDown
然后在 useEffect 钩子中注册了监听器来接收来自主进程的事件
并在组件卸载时删除了这些监听器
  1. import { useEffect } from "react";
  2. // 使用了 ipcRenderer 来监听来自主进程的事件
  3. const { ipcRenderer } = window.require("electron");

  4. const useKeyboardController = (
  5.   handleMoveUp: Function,
  6.   handleMoveDown: Function
  7. ) => {
  8.   useEffect(() => {
  9.     if (ipcRenderer && handleMoveUp && handleMoveDown) {
  10.       // 处理上键逻辑
  11.       const handleMoveUpWrapper = () => handleMoveUp();
  12.       // 处理下键逻辑
  13.       const handleMoveDownWrapper = () => handleMoveDown();

  14.       // 事件监听
  15.       ipcRenderer.on("move-up", handleMoveUpWrapper);
  16.       ipcRenderer.on("move-down", handleMoveDownWrapper);
  17.       return () => {
  18.         // 取消事件监听
  19.         ipcRenderer.removeListener("move-up", handleMoveUpWrapper);
  20.         ipcRenderer.removeListener("move-down", handleMoveDownWrapper);
  21.       };
  22.     }
  23.   }, [handleMoveUp, handleMoveDown]);
  24. };

  25. export default useKeyboardController;
复制代码
3. 上下键选中切换
为了实现键盘上下键进行列表数据切换

可以使用 activeIndex 的状态来跟踪当前选中的项,并结合键盘上下键事件处理

以下是相应的完整代码:



  1. import useKeyboardController from "./useKeyboardController";

  2. const [activeIndex, setActiveIndex] = useState(0);

  3. const handleMoveUp = () => {
  4.   // 处理向下键逻辑 序号减1
  5.   setActiveIndex(activeIndex - 1);
  6. };

  7. const handleMoveDown = () => {
  8.   // 处理向下键逻辑 序号加1
  9.   setActiveIndex(activeIndex + 1);
  10. };

  11. useKeyboardController(
  12.   handleMoveUp,
  13.   handleMoveDown,
  14.   handleMoveLeft,
  15.   handleMoveRight
  16. );
复制代码
4. 左右键页面切换
为了实现键盘左右键实现翻页功能

可以使用 currentPage 的状态来跟踪当前页数,并结合键盘左右键事件处理。

其他逻辑和左右键基本一样,此处就不重复写了。

  1. // 左右键盘事件注册
  2. globalShortcut.register("Left");
  3. globalShortcut.register("Right");

  4. const handleMoveLeft = () => {
  5.   // 键盘向左执行,页码减1
  6.   setCurrentPage(currentPage - 1);
  7. };
  8. const handleMoveRight = () => {
  9.   // 键盘向右执行,页码加1
  10.   setCurrentPage(currentPage + 1);
  11. };
复制代码
5. ipcRenderer 引用报错
使用const { ipcRenderer } = window.require('electron');代码报错
报错信息如下所示:
window.require is not a function
TypeError: window.require is not a function
解决办法:加一层判断,存在时,才能调用。这样就可以避免在浏览器环境下直接调用 Electron 模块,导致运行异常。
修改 useKeyboardController.tsx 页面逻辑,以下是修改后的代码:

  1. let ipcRenderer;
  2. if (window.require) {
  3.   const electron = window.require("electron");
  4.   ipcRenderer = electron.ipcRenderer;
  5. }
复制代码
6. electron 关闭后打开报错
electron 窗口关闭后再打开,上述代码会导致报错,报错信息如下所示:
A JavaScript error occurred in the main process
UnhandledPromiseRejectionWarning: TypeError: Object has been destroyed
at Function. (main.js:88:9)
at Object.showErrorBox (node:electron/js2c/browser_init:49:5725)
at node:electron/js2c/browser_init:189:763
问题分析:这是因为在窗口关闭后,对快捷键进行了注册,但在重新打开窗口时未进行注册。为避免这种问题,可以在应用关闭时取消注册快捷键监听器,并在应用再次激活时重新注册相同的监听器。
问题解决:窗口重新激活时,重新注册快捷键监听器
以下是修改后的代码:

  1. app.on("activate", () => {
  2.   // 如果窗口重新激活时,重新注册快捷键监听器
  3.   handleRegister();
  4. });

  5. app.on("before-quit", () => {
  6.   // 在应用关闭前取消注册的快捷键监听器
  7.   globalShortcut.unregisterAll();
  8. });
复制代码


相关帖子

扫码关注微信公众号,及时获取最新资源信息!下载附件优惠VIP会员5折;永久VIP免费
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

免责声明:
1、本站提供的所有资源仅供参考学习使用,版权归原著所有,禁止下载本站资源参与商业和非法行为,请在24小时之内自行删除!
2、本站所有内容均由互联网收集整理、网友上传,并且以计算机技术研究交流为目的,仅供大家参考、学习,请勿任何商业目的与商业用途。
3、若您需要商业运营或用于其他商业活动,请您购买正版授权并合法使用。
4、论坛的所有内容都不保证其准确性,完整性,有效性,由于源码具有复制性,一经售出,概不退换。阅读本站内容因误导等因素而造成的损失本站不承担连带责任。
5、用户使用本网站必须遵守适用的法律法规,对于用户违法使用本站非法运营而引起的一切责任,由用户自行承担
6、本站所有资源来自互联网转载,版权归原著所有,用户访问和使用本站的条件是必须接受本站“免责声明”,如果不遵守,请勿访问或使用本网站
7、本站使用者因为违反本声明的规定而触犯中华人民共和国法律的,一切后果自己负责,本站不承担任何责任。
8、凡以任何方式登陆本网站或直接、间接使用本网站资料者,视为自愿接受本网站声明的约束。
9、本站以《2013 中华人民共和国计算机软件保护条例》第二章 “软件著作权” 第十七条为原则:为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。若有学员需要商用本站资源,请务必联系版权方购买正版授权!
10、本网站如无意中侵犯了某个企业或个人的知识产权,请来信【站长信箱312337667@qq.com】告之,本站将立即删除。
郑重声明:
本站所有资源仅供用户本地电脑学习源代码的内含设计思想和原理,禁止任何其他用途!
本站所有资源、教程来自互联网转载,仅供学习交流,不得商业运营资源,不确保资源完整性,图片和资源仅供参考,不提供任何技术服务。
本站资源仅供本地编辑研究学习参考,禁止未经资源商正版授权参与任何商业行为,违法行为!如需商业请购买各资源商正版授权
本站仅收集资源,提供用户自学研究使用,本站不存在私自接受协助用户架设游戏或资源,非法运营资源行为。
 
在线客服
点击这里给我发消息 点击这里给我发消息 点击这里给我发消息
售前咨询热线
312337667

微信扫一扫,私享最新原创实用干货

QQ|免责声明|小黑屋|依星资源网 ( 鲁ICP备2021043233号-3 )|网站地图

GMT+8, 2024-8-24 20:18

Powered by Net188.com X3.4

邮箱:312337667@qq.com 客服QQ:312337667(工作时间:9:00~21:00)

快速回复 返回顶部 返回列表