Miq*_*iqe 36 javascript node.js nw.js electron
我希望我的Electron.js应用程序能够存放在系统托盘上,每当用户想要做某些事情时,他们都可以从系统托盘中恢复,并将其最小化/关闭回系统托盘.我怎么做?
我已经看过tray文档中的部分但是没有太大帮助实现我想要的东西.
这是我到目前为止在main.js文件上得到的
var application = require('app'),
BrowserWindow = require('browser-window'),
Menu = require('menu'),
Tray = require('tray');
application.on('ready', function () {
var mainWindow = new BrowserWindow({
width: 650,
height: 450,
'min-width': 500,
'min-height': 200,
'accept-first-mouse': true,
// 'title-bar-style': 'hidden',
icon:'./icon.png'
});
mainWindow.loadUrl('file://' + __dirname + '/src/index.html');
mainWindow.on('closed', function () {
mainWindow = null;
});
mainWindow.setMenu(null);
var appIcon = null;
appIcon = new Tray('./icon-resized.png');
var contextMenu = Menu.buildFromTemplate([
{ label: 'Restore', type: 'radio' }
]);
appIcon.setToolTip('Electron.js App');
appIcon.setContextMenu(contextMenu);
});
Run Code Online (Sandbox Code Playgroud)
更新:
我发现了这个菜单库,但它在linux上无法正常工作.
Miq*_*iqe 68
我实际上很久以前就已经知道了,但对于那些在这里遇到同样问题的人来说,有一种方法可以实现最小化tray和恢复tray.诀窍是捕捉close和minimize事件.
var BrowserWindow = require('browser-window'),
var mainWindow = new BrowserWindow({
width: 850,
height: 450,
title: "TEST",
icon:'./icon.png'
});
mainWindow.on('minimize',function(event){
event.preventDefault();
mainWindow.hide();
});
mainWindow.on('close', function (event) {
if(!application.isQuiting){
event.preventDefault();
mainWindow.hide();
}
return false;
});
Run Code Online (Sandbox Code Playgroud)
并从中恢复 Tray
var contextMenu = Menu.buildFromTemplate([
{ label: 'Show App', click: function(){
mainWindow.show();
} },
{ label: 'Quit', click: function(){
application.isQuiting = true;
application.quit();
} }
]);
Run Code Online (Sandbox Code Playgroud)
Jal*_*afa 11
对于那些不想改变minimize行为的人来说,这是一种比使用标志更好的方法:
通常只是close使用事件隐藏窗口mainWindow.hide()
mainWindow.on('close', function (event) {
event.preventDefault();
mainWindow.hide();
});
Run Code Online (Sandbox Code Playgroud)
然后调用mainWIndow.destroy()强制关闭窗口。它还保证执行closed事件处理程序。
从文档:
强制关闭窗口,网页不会发出 unload 和 beforeunload 事件,该窗口也不会发出 close 事件,但保证会发出 closed 事件。
var contextMenu = Menu.buildFromTemplate([
{ label: 'Show App', click: function(){
mainWindow.show();
} },
{ label: 'Quit', click: function(){
mainWindow.destroy();
app.quit();
} }
]);
Run Code Online (Sandbox Code Playgroud)
Vis*_*ori 10
如果您希望始终在系统托盘上显示图标,直到您不退出应用程序,我会使用方案更新代码
var { app, BrowserWindow, Tray, Menu } = require('electron')
var path = require('path')
var url = require('url')
var iconpath = path.join(__dirname, 'user.ico') // path of y
var win
function createWindow() {
win = new BrowserWindow({ width: 600, height: 600, icon: iconpath })
win.loadURL(url.format({
pathname: path.join(__dirname, 'index.html'),
}))
var appIcon = new Tray(iconpath)
var contextMenu = Menu.buildFromTemplate([
{
label: 'Show App', click: function () {
win.show()
}
},
{
label: 'Quit', click: function () {
app.isQuiting = true
app.quit()
}
}
])
appIcon.setContextMenu(contextMenu)
win.on('close', function (event) {
win = null
})
win.on('minimize', function (event) {
event.preventDefault()
win.hide()
})
win.on('show', function () {
appIcon.setHighlightMode('always')
})
}
app.on('ready', createWindow)
Run Code Online (Sandbox Code Playgroud)
除了上述答案以外- isQuiting标记也值得在应用的before-quit回调中设置。这样,如果操作系统或用户以其他方式(例如通过Macos Dock任务栏的quit命令)请求,则可以正确关闭应用程序。完整的Typescript友好代码段:
import {app, BrowserWindow, Tray, Menu} from 'electron';
import * as path from 'path';
let window;
let isQuiting;
let tray;
app.on('before-quit', function () {
isQuiting = true;
});
app.on('ready', () => {
tray = new Tray(path.join(__dirname, 'tray.png'));
tray.setContextMenu(Menu.buildFromTemplate([
{
label: 'Show App', click: function () {
window.show();
}
},
{
label: 'Quit', click: function () {
isQuiting = true;
app.quit();
}
}
]));
window = new BrowserWindow({
width: 850,
height: 450,
show: false,
});
window.on('close', function (event) {
if (!isQuiting) {
event.preventDefault();
window.hide();
event.returnValue = false;
}
});
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
25282 次 |
| 最近记录: |