У меня есть электронное приложение, которое работает в основном в фоновом режиме, иногда открывая окно в правом нижнем углу экрана в ответ на сообщения, полученные клиентом NATS.
В приложении есть значок на панели задачи меню с кнопкой выхода, которая вызывает electron.app.quit()
const createTray = () => {
const trayIconPath = path.join(__dirname, "icon.png");
tray = new Tray(trayIconPath);
const menuTemplate = [
{
label: `Version: ${app.getVersion()}`,
type: "normal",
enabled: false
},
...(other buttons here)...
{
label: "Quit",
type: "normal",
click: app.quit
},
{ label: "Exit", type: "normal", click: app.exit }
];
const contextMenu = Menu.buildFromTemplate(menuTemplate);
tray.setToolTip("Tooltip text");
tray.setContextMenu(contextMenu);
};
В Linux эта кнопка работает нормально.Приложение закрывается, и когда я проверяю ps
, я обнаруживаю, что задача больше не выполняется.
В Windows она, похоже, ничего не делает.Приложение продолжает работать, значок остается в трее, и если я нажимаю любую другую кнопку в трее, они работают нормально, как будто приложение никогда не закрывалось.
Примечание: кнопка выхода работает на обоихплатформ, но не запускает событие will-quit
, к которому я хотел бы добавить обработчик.
Чтобы попытаться отладить, я попытался добавить обработчики к before-quit
, will-quit
иquit
events:
app.on("before-quit", () => {
console.log("before-quit");
dialog.showMessageBoxSync(null, {
title: "Before Quit",
message: "Before Quit",
buttons: ["OK"]
});
});
app.on("will-quit", () => {
console.log("will-quit");
dialog.showMessageBoxSync(null, {
title: "Will Quit",
message: "Will Quit",
buttons: ["OK"]
});
});
app.on("quit", () => {
console.log("did quit");
dialog.showMessageBoxSync(null, {
title: "Did Quit",
message: "Did Quit",
buttons: ["OK"]
});
});
В Linux, после нажатия Quit, я вижу все три диалоговых окна, открытых до выхода из приложения.
В Windows, после нажатия Quit, я вижу Before Quit
диалог открыт, но ни один из двух других не делает.
На данный момент нет других обработчиков этих событий.
Я попытался добавить блок try / catch вокруг вызова приложения.quit, заменив обработчик нажатия кнопки Quit следующим методом:
const quit = () => {
try {
mainWindow.close();
app.quit();
} catch (err) {
console.error(err);
dialog.showMessageBoxSync(null, {
title: "Error quitting",
message: err.message,
buttons: ["OK"]
});
}
};
После внесения этого изменения и попытки выйти из приложения в Windows я по-прежнему вижу диалоговое окно Before Quit
, ноне вижу ни одного сообщения об ошибке, и приложение продолжаетдля запуска.
Итак, что мешает моему приложению правильно завершить работу в Windows?Что еще я могу сделать для устранения проблемы?