|
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 |