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);
});
UPDATE:
私はこれを見つけました menubar repoですが、Linuxでは期待通りに動作しません。
私はずっと前にそれを実際に理解しましたが、ここで同じ問題に遭遇した人にとっては、tray
に最小化し、tray
から復元する方法の1つです。トリックは、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;
});
Tray
からの復元
var contextMenu = Menu.buildFromTemplate([
{ label: 'Show App', click: function(){
mainWindow.show();
} },
{ label: 'Quit', click: function(){
application.isQuiting = true;
application.quit();
} }
]);
アプリケーションを終了しない限り、常にシステムトレイにアイコンを表示したい場合は、シナリオでコードを更新しました。
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)
上記の回答に追加-isQuiting
フラグはアプリで設定する価値がありますbefore-quit
コールバックも。このように、OSまたはユーザーから他の方法で要求された場合、アプリケーションは適切に閉じられます。 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;
}
});
});
フラグを使用するよりも、minimize
の動作を変更したくない場合に適した方法:
通常、mainWindow.hide()
を使用してclose
イベントでウィンドウを非表示にします
_mainWindow.on('close', function (event) {
event.preventDefault();
mainWindow.hide();
});
_
次に、mainWIndow.destroy()
を呼び出して、ウィンドウを強制的に閉じます。また、closed
イベントハンドラーの実行も保証されます。
ドキュメント から:
ウィンドウを強制的に閉じると、unloadイベントとbeforeunloadイベントはWebページに対して発行されず、closeイベントもこのウィンドウに対して発行されませんが、closedイベントが発行されることが保証されます。
_var contextMenu = Menu.buildFromTemplate([
{ label: 'Show App', click: function(){
mainWindow.show();
} },
{ label: 'Quit', click: function(){
mainWindow.destroy();
app.quit();
} }
]);
_
非表示ではなくイベントを最小化してみてください。
_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.minimize();
});
mainWindow.on('close', function (event) {
event.preventDefault();
mainWindow.minimize();
return false;
});
_
これは私のために働いた。 hide()
はウィンドウを閉じていました。