From a88cd66fe42e2ec3324e1c4b319e6085227464f1 Mon Sep 17 00:00:00 2001 From: purocean Date: Mon, 19 Aug 2019 15:59:28 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=BF=AB=E6=8D=B7=E9=94=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app.ts | 34 ++++++++++++++++++++++++++++------ src/shortcut.ts | 24 ++++++++++++++++++++++++ 2 files changed, 52 insertions(+), 6 deletions(-) create mode 100644 src/shortcut.ts diff --git a/src/app.ts b/src/app.ts index 92e1d04b..85197d04 100644 --- a/src/app.ts +++ b/src/app.ts @@ -4,6 +4,7 @@ import { dialog } from 'electron' import server from './server/main' import { USER_DIR } from './server/constant' import * as updater from './updater' +import { getAccelerator, registerShortcut } from './shortcut' const opn = require('opn') let isDev = false @@ -20,6 +21,13 @@ let win: BrowserWindow | null = null // 系统托盘 let tray = null +const hide = () => { + if (win) { + win.hide() + win.setSkipTaskbar(true) + } +} + const createWindow = () => { win = new BrowserWindow({ maximizable: true, @@ -43,8 +51,7 @@ const createWindow = () => { }, 0) win.on('close', e => { - win.hide() - win.setSkipTaskbar(true) + hide() e.preventDefault() }) @@ -79,10 +86,17 @@ const createWindow = () => { const showWindow = () => { if (win) { - win.setSkipTaskbar(false) - win.show() - win.maximize() - win.focus() + const show = () => { + win.setSkipTaskbar(false) + win.show() + } + if (win.isFocused() && win.isVisible()) { + hide() + } else { + // 先隐藏再显示,以便在 windows 10 当前虚拟窗口展示 + hide() + setTimeout(show, 100) + } } else { createWindow() } @@ -140,10 +154,17 @@ if (!gotTheLock) { showWindow() + // 注册快捷键 + registerShortcut({ + 'show-main-window': () => showWindow(), + 'open-in-browser': () => opn(getUrl()) + }) + const contextMenu = Menu.buildFromTemplate([ { type: 'normal', label: '打开主界面', + accelerator: getAccelerator('show-main-window'), click: () => { showWindow() } @@ -151,6 +172,7 @@ if (!gotTheLock) { { type: 'normal', label: '浏览器中打开', + accelerator: getAccelerator('open-in-browser'), click: () => { opn(getUrl()) } diff --git a/src/shortcut.ts b/src/shortcut.ts new file mode 100644 index 00000000..0a2265e2 --- /dev/null +++ b/src/shortcut.ts @@ -0,0 +1,24 @@ +import { globalShortcut, dialog } from 'electron' + +type AcceleratorType = 'show-main-window' | 'open-in-browser' +export const getAccelerator = (type: AcceleratorType) => { + return { + 'show-main-window': 'Super+Shift+O', + 'open-in-browser': 'Super+Shift+B' + }[type] +} + +export const registerShortcut = (shortcuts: {[key in AcceleratorType]: () => void}) => { + Object.keys(shortcuts).forEach((key: AcceleratorType) => { + const accelerator = getAccelerator(key) + globalShortcut.register(accelerator, shortcuts[key]) + + if (!globalShortcut.isRegistered(accelerator)) { + dialog.showMessageBox({ + type: 'error', + title: `Yank Note 注册快捷键失败`, + message: `[${accelerator}] 快捷键有冲突`, + }) + } + }) +}