--- layout: post title: Electron 中打开 QQ 临时会话 date: 2019-04-24 21:11:09+0800 thumb: IMG_PATH/electron.svg category: tech tags: [Electron, QQ] --- Electron [[1]][1]允许通过编写网页来构建桌面程序,使得开发桌面软件变得异常轻松,各类通过 Electron 开发的软件层出不穷。此文主要针对网页里的 QQ 临时会话按钮,使用 Electron 应该如何优雅地操作呢? ## QQ 临时会话 虽然我现在已经很少上 Q,但不得不说,QQ 临时会话是很方便的一个功能。它允许在网页里添加一条链接点击直接弹出 QQ 会话。 可直接在 QQ 推广[[2]][2]中登录并生成链接,格式如: ```{% raw %} http://wpa.qq.com/msgrd?v=3&uin={{uin}}&site=qq&menu=yes {% endraw %}``` 若是在网页中引入,可直接加上新窗口打开但属性,如: ```html QQ 交谈 ``` 又或者可以直接使用 tencent 协议的链接来发起临时会话,链接如 `tencent://message/?uin=10000`,则 HTML 如下: ```html QQ 交谈 ``` ## Electron 与 QQ 临时会话 在 Electron 中,如若直接采用网页中的方式,点击链接将会在新的窗口中打开,而且你无法控制它,这明显不是我们想要的。 Electron 有个 shell[[3]][3] 模块,可提供使用默认浏览器中打开链接的功能,如: ```javascript const { shell } = require('electron') shell.openExternal('tencent://message/?uin=10000') ``` 这个体验比起第一种要好一些,但明显也不是我们想要的。如果能静默打开链接,达到直接弹出 QQ 会话,这个体验就比较好。这就需要用到 Electron 的 window.open 函数[[4]][4],熟面熟面,其实可以说就是浏览器中的 window.open [[5]][5]。 倘若按照默认方式弹出新的 BrowserWindow,那么与第一种方式效果无异,可以自动将窗口关掉,也即: ```javascript const chat = window.open('tencent://message/?uin=10000') setTimeout(()=>{ chat.close() },2000) ``` 我们需要隐藏掉这个新创建的 BrowserWindow,按照 window.open 文档最底部的说法,定制弹出的新窗口。可直接将 `show` 选项设置为 `false` 达到隐藏效果,如下: ```javascript // main process const win = new BrowserWindow() win.webContents.on('new-window', (event, url, frameName, disposition, options, additionalFeatures) => { if (frameName === 'chat') { Object.assign(options, { modal: true, parent: win, show: false }) event.newGuest = new BrowserWindow(options) } }) ``` 五秒后关闭这个隐藏的窗口。 ```javascript // renderer process const chat = window.open('tencent://message/?uin=10000', 'chat') setTimeout(()=>{ chat.close() },5000) ``` ## 参考资料 [1]: http://electronjs.org "Electron | 使用 JavaScript, HTML 和 CSS 构建跨平台的桌面应用。" [2]: https://shang.qq.com/v3/widget.html "QQ 推广" [3]: https://electronjs.org/docs/api/shell "shell | Electron" [4]: https://electronjs.org/docs/api/window-open "window.open 函数 | Electron" [5]: https://developer.mozilla.org/zh-CN/docs/Web/API/Window/open "window.open - Web API 接口参考 | MDN" **本文历史** * 2019 年 04 月 24 日 完成初稿 [p1]: {{ site.IMG_PATH }}/use-a-non-monospace-font-in-gvim-01.png "使用 Zpix C.O.D.E 的 gVim"