【Electron Playground 系列】托盤(pán)篇

作者:梁棒棒

托盤(pán)雖小膜眠,作用不小言询。它是你的應(yīng)用正在操作系統(tǒng)運(yùn)行的標(biāo)識(shí)亲善,它可以通知你有新消息环戈,可以喚醒應(yīng)用界面闷板,可以設(shè)置上下文(右鍵)菜單設(shè)置更多的功能等。下面我們就來(lái)一一實(shí)現(xiàn)這些功能院塞,要在主進(jìn)程進(jìn)行操作遮晚。

1. 創(chuàng)建托盤(pán)

首先來(lái)創(chuàng)建一個(gè)托盤(pán)圖標(biāo),簡(jiǎn)單三步即可:

  1. 從electron庫(kù)引入Tray類(lèi)
  2. 獲取圖標(biāo)地址
  3. 實(shí)例化Tray并傳入圖標(biāo)地址

代碼也很簡(jiǎn)單:

const { Tray } = require('electron')
const path = require('path')

const icon = path.join(__dirname, '你的圖片路徑')
new Tray(icon)

一個(gè)系統(tǒng)托盤(pán)就會(huì)被創(chuàng)建出來(lái)拦止。很簡(jiǎn)單對(duì)不對(duì)县遣,但是這個(gè)圖標(biāo)現(xiàn)在還沒(méi)有任何功能,接下來(lái)我們?yōu)閳D標(biāo)添加一些屬性和事件创泄。

2. 設(shè)置托盤(pán)屬性

為tray實(shí)例設(shè)置一些屬性和事件,包括上下文菜單括蝠、鼠標(biāo)移入文字鞠抑。詳細(xì)文檔點(diǎn)擊這里。

這里我們?yōu)閠ray設(shè)置靈活圖標(biāo)忌警,讓它可以根據(jù)系統(tǒng)主題顯示不同的圖標(biāo)搁拙;再設(shè)置一個(gè)鼠標(biāo)移入圖標(biāo)的時(shí)候會(huì)顯示的提示文字,最后為它設(shè)置上下文菜單法绵,讓它可以具備一些功能箕速。

先看下效果圖:

create-tray.gif

附上代碼:

const { Tray, Menu, nativeTheme, BrowserWindow } = require('electron')
const path = require('path')

let tray

// 設(shè)置頂部APP圖標(biāo)的操作和圖標(biāo)
const lightIcon = path.join(__dirname, '..', '..', 'resources', 'tray', 'StatusIcon_light.png')
const darkIcon = path.join(__dirname, '..', '..', 'resources', 'tray', 'StatusIcon_dark.png')

// 根據(jù)系統(tǒng)主題顯示不同的主題圖標(biāo)
tray = new Tray(nativeTheme.shouldUseDarkColors ? darkIcon : lightIcon)

tray.setToolTip('Electron-Playground')

const contextMenu = Menu.buildFromTemplate([
  {
    label: '打開(kāi)新窗口',
    click: () => {
      let child = new BrowserWindow({ parent: BrowserWindow.getFocusedWindow() })
      child.loadURL('https://electronjs.org')
      child.show()
    },
  },
  {
    label: '刪除圖標(biāo)',
    click: () => {
      tray.destroy()
    },
  },
])

// 設(shè)置上下文菜單
tray.setContextMenu(contextMenu)

想親自試一試的話點(diǎn)electron-playground。然后繼續(xù):

上面我們?cè)O(shè)置了托盤(pán)根據(jù)系統(tǒng)主題顯示不同的圖標(biāo)朋譬,但是系統(tǒng)主題是動(dòng)態(tài)的盐茎,又該怎么做呢,請(qǐng)看:

nativeTheme.on('updated', () => {
  tray.setImage(nativeTheme.shouldUseDarkColors ? darkIcon : lightIcon)
})

添加一個(gè)主題監(jiān)聽(tīng)事件就好了徙赢。

更多的屬性字柠、事件和方法列表請(qǐng)看官方文檔探越。

3. 示例

簡(jiǎn)單列舉幾個(gè)示例。

3.1 顯示未讀消息數(shù)(macOS)

在macOS系統(tǒng)下窑业,可以采用setTitle(String)設(shè)置未讀消息數(shù)钦幔。PS:windows下無(wú)效果。

tray.setTitle("1")

效果是這樣的:


set-tray-title.png

3.2 有未讀消息時(shí)圖標(biāo)閃動(dòng)(windows)

在windows下常柄,可通過(guò)setImage設(shè)置正常圖標(biāo)與空?qǐng)D標(biāo)切換達(dá)到閃動(dòng)效果鲤氢。在mac系統(tǒng)下空?qǐng)D標(biāo)不占用圖標(biāo)空間,所以需要設(shè)置透明圖標(biāo)西潘。
你可以在用darkIcon代替nativeImage.createEmpty()然后執(zhí)行看一下效果卷玉。

如何判斷操作系統(tǒng)平臺(tái),點(diǎn)擊這里

windows下效果:

create-glimmer-tray.gif

附代碼:

const { Tray, Menu, BrowserWindow, nativeImage } = require('electron')
const path = require('path')

let tray
let timer
let toggle = true
let haveMessage = true

const lightIcon = path.join(__dirname, '..', '..', 'resources', 'tray', 'StatusIcon_light.png')
const darkIcon = path.join(__dirname, '..', '..', 'resources', 'tray', 'StatusIcon_dark.png')

const win = BrowserWindow.getFocusedWindow();

tray = new Tray(lightIcon)

const contextMenu = Menu.buildFromTemplate([
  {
    label: '張三的消息',
    click: () => {
      let child = new BrowserWindow({ parent: BrowserWindow.getFocusedWindow() })
      child.loadURL('https://electronjs.org')
      child.show()
    },
  },
  { type: 'separator' },
  {
    label: '刪除圖標(biāo)',
    click: () => {
      tray.destroy()
      clearInterval(timer)
    },
  },
])

tray.setContextMenu(contextMenu)

tray.setToolTip('Electron-Playground')

if (haveMessage) {
  timer = setInterval(() => {
    toggle = !toggle
    if (toggle) {
      tray.setImage(nativeImage.createEmpty())
    } else {
      tray.setImage(lightIcon)
    }
  }, 600)
}

3.3 雙擊托盤(pán)顯示隱藏界面(windows)

windows下效果:

create-toggle-tray.gif

附代碼:

const { Tray, BrowserWindow } = require('electron')
const path = require('path')

let tray

const lightIcon = path.join(__dirname, '..', '..', 'resources', 'tray', 'StatusIcon_light.png')

const win = BrowserWindow.getFocusedWindow()

tray = new Tray(lightIcon)

tray.on('double-click', () => {
  win.isVisible() ? win.hide() : win.show()
})

注:此效果在windows上良好秸架,在mac下會(huì)有些問(wèn)題揍庄,雙擊事件可能會(huì)失效,實(shí)際使用過(guò)程中要注意东抹,不過(guò)mac下一般也不會(huì)用到這個(gè)事件蚂子。

我們是曉黑板前端,歡迎關(guān)注我們的知乎缭黔、Segmentfault食茎、CSDN簡(jiǎn)書(shū)馏谨、開(kāi)源中國(guó)别渔、博客園賬號(hào)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末惧互,一起剝皮案震驚了整個(gè)濱河市哎媚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌喊儡,老刑警劉巖拨与,帶你破解...
    沈念sama閱讀 216,591評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異艾猜,居然都是意外死亡买喧,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)匆赃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)淤毛,“玉大人,你說(shuō)我怎么就攤上這事算柳〉偷” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,823評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)查牌。 經(jīng)常有香客問(wèn)我事期,道長(zhǎng),這世上最難降的妖魔是什么纸颜? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,204評(píng)論 1 292
  • 正文 為了忘掉前任兽泣,我火速辦了婚禮,結(jié)果婚禮上胁孙,老公的妹妹穿的比我還像新娘唠倦。我一直安慰自己,他們只是感情好涮较,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布稠鼻。 她就那樣靜靜地躺著,像睡著了一般狂票。 火紅的嫁衣襯著肌膚如雪候齿。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,190評(píng)論 1 299
  • 那天闺属,我揣著相機(jī)與錄音慌盯,去河邊找鬼。 笑死掂器,一個(gè)胖子當(dāng)著我的面吹牛亚皂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播国瓮,決...
    沈念sama閱讀 40,078評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼灭必,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了乃摹?” 一聲冷哼從身側(cè)響起禁漓,我...
    開(kāi)封第一講書(shū)人閱讀 38,923評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎孵睬,沒(méi)想到半個(gè)月后播歼,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,334評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡肪康,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評(píng)論 2 333
  • 正文 我和宋清朗相戀三年荚恶,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了撩穿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片磷支。...
    茶點(diǎn)故事閱讀 39,727評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖食寡,靈堂內(nèi)的尸體忽然破棺而出雾狈,到底是詐尸還是另有隱情,我是刑警寧澤抵皱,帶...
    沈念sama閱讀 35,428評(píng)論 5 343
  • 正文 年R本政府宣布善榛,位于F島的核電站辩蛋,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏移盆。R本人自食惡果不足惜悼院,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望咒循。 院中可真熱鬧据途,春花似錦、人聲如沸叙甸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,672評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)裆蒸。三九已至熔萧,卻和暖如春叔收,著一層夾襖步出監(jiān)牢的瞬間荷科,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,826評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工凭需, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留久妆,地道東北人晌杰。 一個(gè)月前我還...
    沈念sama閱讀 47,734評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像筷弦,于是被迫代替她去往敵國(guó)和親肋演。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容