查看: 247|回复: 0

Electron 键盘快捷键

[复制链接]
  • TA的每日心情
    奋斗
    2022-7-25 00:26
  • 签到天数: 1 天

    [LV.1]初来乍到

    5万

    主题

    5万

    帖子

    16万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    167923
    发表于 2022-10-29 15:11:02 | 显示全部楼层 |阅读模式
    4 M4 S3 B# e$ j* N, d

    本节我们学习 Electron 中的键盘快捷键。在 Electron 中,键盘快捷键被称作加速器,它们能够分派到运用程序菜单中的操纵上,也能够全局分派,所以纵然你的运用程序没有取得键盘核心,它们也能够被触发。

    3 X& E$ a" c7 h8 Y8 R3 c. K

    Electron 中有主进程和渲染进程这两种进行,所以我们可以分别在主进程中注册快捷键和在渲染进程中注册快捷键。

    / p. Q2 c5 ?9 z+ |0 x

    主进程注册快捷键

    7 K: S: ^* z& b3 L

    在主进程注册快捷键有两种方式,一种是利用 Menu 模块来模拟快捷键,二就是全局快捷键。

    1 i! p7 x( ^7 E# G/ `7 R/ G

    本地快捷键

    7 n2 {+ O0 R' D8 ]0 |: T& f

    我们可以使用 Electron 中的 Menu 模块来配置键盘快捷键,只有在 app 处于焦点状态时才可以触发快捷键,使用比较少。我们在创建 Menuitem 时必须指定一个 accelerator 属性。

    . n) P0 {* p$ s# ]7 M, u( n1 n

    示例:

    const { Menu, MenuItem } = require(electron);- u0 K: T: G9 w9 Z! x) r2 p const menu = new Menu(); 8 J1 ?& J2 ]( y$ a; K $ r% t2 y2 N9 v( Z' K# u$ V menu.append(new MenuItem({ " i0 \6 r% d0 H/ j% G* l; }1 p label: Print, z ]7 g5 T& W! B8 W; x0 g accelerator: Ctrl+P,' W/ v# Q' I: [5 q, l( @ click: () => { console.log(打印资料) } : J( f& [* Z7 ?( j }))3 \" j+ ~* p. i8 I) Q( v( z

    我们还可以根据用户的操作系统配置不同的组合键:

    accelerator: process.platform === darwin ? Alt+Ctrl+I : Ctrl+Shift+I r% }9 L, E! e% R

    全局快捷键

    ! g# _7 [# o+ X$ ^- ~! T

    在应用程序没有键盘焦点时,我们可以使用 globalshortcut 模块检测键盘事件。我们来看下面这个例子。

    9 [0 z& {4 h7 B7 _7 R+ O

    示例:

    0 U' K) I3 v$ s5 k# l8 a

    下面代码中,我们将开发者工具的快捷键设置为 Alt+B

    // 引入electron ; ^3 i2 M* K7 d. i" z const {app, BrowserWindow,globalShortcut} = require(electron); 4 |. v# c. z& G& t9 `* U let win;# ~# g5 e1 n9 z$ B* \- ] ( `. P- [- c- f9 J6 s function createWindow() { 9 C3 ~7 F# F& K3 N( ~% ~' g5 x // 创建浏览器窗口 U9 F% I- Y+ ^6 D win = new BrowserWindow({ [) z p/ `6 W width: 800, - W; e( J2 d& ~8 Y: |. R height: 400,+ V6 l' r$ E k$ f: l3 \7 z { webPreferences: {' N9 Q* X) J2 z* ?- @3 G; X nodeIntegration: true,7 f/ G8 [; c& x$ H9 g5 s }, ! [/ c8 K0 d( B: f: ?* z& g }); ! F. P8 ~/ T8 M5 R& g7 u 4 l% N, n2 g" l6 d# z // 加载index.html文件+ p3 [# x# G- o7 v' E& l' D( { win.loadFile(../html/index.html);! _3 V* W3 ]1 k( B9 y 2 l- L/ Q5 C, j2 m // 自动打开开发者工具) B2 x' i4 ?$ V& W8 p // win.webContents.openDevTools(); ) X# `; b% [- R1 l& ^( `7 L' u4 a% r) Y // 当 window 被关闭,这个事件会被触发3 f, S9 w5 u S# K0 T( @3 A win.on(closed, () => {* F: F+ x# ~$ L1 m* A5 ?+ T win = null;* S8 a* f$ N1 G; D }); L6 O. V. x N% B- m }6 H* D. ]$ j2 O4 o 9 v# Z0 b. @1 [1 O& u4 j // Electron 会在初始化后并准备,创建浏览器窗口时,调用这个函数 ' q3 b; Y! o+ x0 ?/ G6 ^4 D# Z; h) f app.on(ready, createWindow);/ B- L; y: g5 e0 y3 _0 e: ] // 当全部窗口关闭时退出 0 a4 z2 w7 Z; \( Y" \2 A app.on(window-all-closed, () => {3 \ U/ g3 d' O! w if (process.platform !== darwin) {( C8 u+ E- m+ c# t* {7 j app.quit(); , e4 }4 J4 R* L. ?8 g0 S6 ?5 H7 { } # O! {# _. z) b1 ? });& c! J7 M# d% s app.on(activate, () => {' O# K9 i9 U4 _ e3 e if (win === null) { ; |5 L I" k5 E createWindow();7 m$ d* T: }! R) }+ K B1 i3 C @ }2 a: c5 P) W8 {/ E0 p- `+ m });8 ?* Y* p0 e' X 7 H$ u7 ?( W1 z // 注册快捷键 ( K0 u7 s9 M) i* L2 S1 Z6 T app.on(ready, async () => { 7 T! j8 |; e! e/ `7 H+ c) R globalShortcut.register(Alt+B, function () { - w# G) [3 f, U ^ win.webContents.openDevTools(); - n, K/ p: e; {4 Y }), N1 ~5 i. ^& v3 w1 X" r1 d createWindow();! e, R+ H) G8 V }) . P. `0 S! j b0 o7 J& q: k/ e

    然后我们运行 npm start 启动程序,只需要按下 Alt+B 键就可以打开开发者工具啦。

    5 Q7 d' r5 Q; W& C

    如果我们不想要设置好的快捷键,也可以注销快捷键,代码如下所示:

    app.on(ready, () => {6 I5 M* f* X7 x, l // 注销快捷键% H; u" q7 S. b) s. f6 a globalShortcut.register(Alt+B, () => { 8 n. C5 `6 r9 \ console.log(按下Alt+B);. u' i& S/ r' A! [* S J }) & t' S9 g. Q; P# y2 @ // 注销所有快捷键 * U2 K' J! ~% m1 b' ^/ p globalShortcut.unregisterAll();, }5 Z7 ^; W9 H. J }) + C- a# i/ q! z6 E0 m. T- a5 s

    渲染进程注册快捷键

    : H' _( y. `- p" Q( k2 V5 h: r2 w

    渲染进程注册快捷键也有两种方式,一个是利用浏览器监听键盘事件,另一个是利用第三方模块。

    . ^, y5 q$ t0 R! ~4 U, L2 t

    浏览器窗口的快捷方式

    * S+ D9 t3 w# p

    我们可以利用浏览窗口监听键盘事件,这是一种常规的方式,自己判断什么键按下:

    window.addEventListener(keyup, doSomething, true); & b1 |( V; k% U$ ^8 m! j& J

    第三个参数 true 的意思就是说监听器将一直在其他监听器之前收到按键,以避免其它监听器调用 stopPropagation()

    ) s7 i- j5 |! j+ ~8 ~! D2 U$ ^0 V

    利用第三方模块

    ( j9 ?5 `+ P1 q

    如果我们不想手动进行快捷键解析,可以使用一些库来进行高级的按键检测,比如 Mousetrap

    4 c* \3 i1 @& Q q0 l

    首先我们需要安装这个库,然后使用 Script 标签引入

    npm install mousetrap --save 1 u+ P% e* B9 [2 S9 i( ]

    HTML 页面中引入 index.js 文件::

    <!DOCTYPE html> ( M/ j! G- m8 _. ~; i& h) P$ j, T; P <html> ! M# ^' J3 {+ F! Z: k! Q <head> : w" h5 a6 o$ e, f# Y6 w2 o <meta charset="UTF-8"> ) n9 k7 R4 a1 z9 c <title>my_electron</title>6 q7 O' P( ] Q( {. _: f# k </head> , Y& w# r( T7 a, O* I9 ^' E5 s <body>, l0 u% B, n; ^3 n5 K: F. q( N <h2>你好,侠课岛!</h2> p4 S- |! o5 e. E b" q <script type="text/javascript" src=".js/index.js"></script> $ V1 u, o0 k8 G+ A/ U </body>* a ^" q" ~5 j5 d/ J </html> 4 Q" b1 t& E8 f8 z0 t2 C

    index.js 文件内容:

    const Mousetrap = require(mousetrap); 4 s9 M7 v; i4 y4 r% F: d , \$ W/ H8 U+ Q' f+ h: m. b // 1:单个快捷键 4 I3 k. e4 f) h) k/ ^ Mousetrap.bind(4, () => { console.log(4) })4 q" W* O2 F. C7 S {. {4 m' u) r Mousetrap.bind(?, () => { console.log(显示快捷方式!) })7 Q5 k8 d* U" |* s8 N Mousetrap.bind(esc, () => { console.log(escape) }, keyup)# V m4 i' A; ^# x, f0 s / t0 A' q9 q/ ]& _( g // 2:组合 3 _" J: E: ?: J" t+ u Mousetrap.bind(Alt+shift+k, () => { console.log(alt+shift+k) }) K8 I$ ]6 O3 v+ }' Q8 p ' F- }; j) B4 O+ x- Z) ]# h // 3:将多个组合映射到同一回调 , l$ {( u, ^+ h4 o. ^, p Mousetrap.bind([Alt+k, ctrl+k], () => {: C" |+ c) O7 q+ O$ ^( } console.log(Alt+k 或者 ctrl+k);' t( h9 E/ M: y9 m7 m$ b! \ // 返回false以防止默认行为和停止事件冒泡0 T) i4 ~& O" e& p return false; 5 \5 f5 O0 H! H, t2 Y }) 9 f7 d6 I- |+ v5 x; V& I% g9 ?, Y9 c5 Q // Gmail样式序列 : s) v+ w" g. M2 ~7 Y Mousetrap.bind(g i, () => { console.log(转到收件箱) });% b4 x: l4 E6 q& B7 \/ W Mousetrap.bind(* a, () => { console.log(全选) }); * s, i1 j- J- s 2 ]) z; G5 W: C9 n$ w- n* g9 a // konami code! 0 z3 w; ?% R `; _* @# X' {8 C$ v Mousetrap.bind(up up down left right right left b a enter, () => {1 [+ u/ W5 r/ ~' k/ `- i { console.log(xkd_v3新版);, ^0 ?$ S) ^6 N* P9 V })6 ]& h# H3 k! I& L5 y3 \0 h* _' E) o $ F% r7 K1 B! s5 I/ @ & Z- n+ ~) r) M& n) _3 C5 V
    回复

    使用道具 举报

    懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    客服QQ/微信
    921439866 周一至周日:09:00 - 21:00
    致力打造互联网创业第一品牌,学习网上创业赚钱,首选泓嘉网络创业,值得信赖! 泓嘉网络科技 版权所有!

    本站内容均转载于互联网,并不代表泓嘉网立场! 拒绝任何人以任何形式在本站发表与中华人民共和国法律相抵触的言论!。

    信息产业部备案号 豫ICP备2022016396号-1

    QQ|免责声明|广告服务|小黑屋|泓嘉网创 ( 豫ICP备2022016396号-1 )|网站地图

    GMT+8, 2026-4-18 06:00 , Processed in 0.423273 second(s), 26 queries .

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