国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

electron程序保護措施(崩潰監控,開機自啟,托盤關閉)

2i18ns / 4513人閱讀

摘要:當設置了參數時,將作為命令行參數傳遞。托盤關閉向和微信一樣,有的時候我們并不想讓用戶通過點關閉按鈕的時候就關閉程序,而是把程序最小化到托盤,在托盤上做真正的退出操作。首先要監聽窗口的關閉事件,阻止用戶關閉操作的默認行為。

在某種情況下,我們可能希望我們的客戶端程序盡可能連續不斷的運行在我們的系統中,并保持穩定。

以下幾種方式可以幫助我們做到這一點:

1.崩潰監控

electron為我們提供了監聽程序崩潰的事件:

Event: "crashed"
返回:

event Event
killed Boolean
當渲染進程崩潰或被結束時觸發

此事件是用來家庭渲染進程崩潰的,但是當主進程意外崩潰時也會觸發該事件。

在監測到程序崩潰后,我們要讓程序重新啟動,此時我們要首先判斷window對象是否被銷毀,也就是主進程是否被殺死,還是渲染進程崩潰,同時作出不同的處理。

當mainWin被銷毀時我們直接重啟整個應用,使用如下api:

app.relaunch([options])
options Object (可選)

args String
execPath String (可選)
從當前實例退出,重啟應用。

默認情況下,新的實例會和當前實例使用相同的工作目錄以及命令行參數。 當設置了 args 參數時, args 將作為命令行參數傳遞。 當設置了 execPath ,execPath 將被執行以重新啟動,而不是當前的應用程序。

請注意, 此方法在執行時不會退出當前的應用程序, 你需要在調用 app.relaunch 方法后再執行 app. quit 或者 app.exit 來讓應用重啟。

只是渲染進程崩潰,我們只需將其他窗體銷毀,然后重新load我們的主窗口。

崩潰重啟邏輯:

  if (mainWin.isDestroyed()) {
    app.relaunch();
    app.exit(0);
  } else {
    BrowserWindow.getAllWindows().forEach((w) => {
      if (w.id !== mainWin.id) w.destroy();
    });
    mainWin.reload();
  }

當然,我們還要記錄一下程序的崩潰日志,我們要確保日志接口發出成功后再重啟我們的程序:

下面是程序崩潰后的完整邏輯:

import { BrowserWindow, app, dialog} from "electron";

  
const mainWindow = BrowserWindow.fromId(global.mainId);
mainWindow.webContents.on("crashed", () => {
   const options = {
      type: "error",
      title: "進程崩潰了",
      message: "這個進程已經崩潰.",
      buttons: ["重載", "退出"],
    };    
   recordCrash().then(() => {
      dialog.showMessageBox(options, (index) => {
        if (index === 0) reloadWindow(mainWindow);
        else app.quit();
      });
    }).catch((e) => {
      console.log("err", e);
    });
})

function recordCrash() { 
    return new Promise(resolve => { 
       // 崩潰日志請求成功.... 
      resolve();
    })
}
  
function reloadWindow(mainWin) {
  if (mainWin.isDestroyed()) {
    app.relaunch();
    app.exit(0);
  } else {
    BrowserWindow.getAllWindows().forEach((w) => {
      if (w.id !== mainWin.id) w.destroy();
    });
    mainWin.reload();
  }
}

寫好代碼之后,我們可以直接在控制臺輸入 process.crash()來進行測試,或者直接在任務管理器殺掉我們的進程進行測試。

2.開機自啟

開機自啟是保證我們的程序能長時間在機器上運行很重要的一點。

電腦上有很多程序都設置了開機自啟動,比如qq,微信,迅雷等,他們都是通過修改注冊表來實現的,我們可以看一下注冊表 SoftwareMicrosoftWindowsCurrentVersionRun:

所以我們也要將我們程序的路徑寫到這里。

發現了一個非常好的寫注冊表的模塊,winreg
注意mac不能使用這個模塊,所以首先要判斷是否為window再引用這個模塊。

借助這個模塊我們可以非常簡單的修改注冊表:

const WinReg = require("winreg");

const startOnBoot = {
  enableAutoStart: function (name, file, callback) {
    var key = getKey();
    key.set(name, WinReg.REG_SZ, file, callback || noop);
  },
  disableAutoStart: function (name, callback) {
    var key = getKey();
    key.remove(name, callback || noop);
  },
  getAutoStartValue: function (name, callback) {
    var key = getKey();
    key.get(name, function (error, result) {
      if (result) {
        callback(result.value);
      }
      else {
        callback(null, error);
      }
    });
  }
};

function noop() { }

const RUN_LOCATION = "SoftwareMicrosoftWindowsCurrentVersionRun";
function getKey() {
  return new WinReg({
    hive: WinReg.HKCU, //CurrentUser,
    key: RUN_LOCATION
  });
}

export default function autoStart() {
  startOnBoot.getAutoStartValue("MY_CLIENT_AUTOSTART", function (value) {
    if (!value) {
      startOnBoot.enableAutoStart("MY_CLIENT_AUTOSTART", process.execPath, function () { console.log("開機自動啟設置"); });
    }
  });
}

執行完程序之后,再看注冊表,發現我們程序的路徑已經寫進去了:

然后電腦重啟后你的程序就自動啟動了。

3.托盤關閉

向qq和微信一樣,有的時候我們并不想讓用戶通過點關閉按鈕的時候就關閉程序,而是把程序最小化到托盤,在托盤上做真正的退出操作。

首先要監聽窗口的關閉事件,阻止用戶關閉操作的默認行為。

  mainWindow.on("close", (event) => {
    mainWindow.hide();
    event.preventDefault();
  });

然而這時你發現,這只是最小化了程序,任務欄里程序依然存在,我們需要讓程序在任務欄里也消失:

  mainWindow.on("close", (event) => {
    mainWindow.hide();
    mainWindow.setSkipTaskbar(true);
    event.preventDefault();
  });

這時程序就再也找不到了,任務托盤中也沒有我們的程序,所以我們要先創建好任務托盤,并做好事件監聽:

function createTray() {
    const mainWindow = BrowserWindow.fromId(global.mainId);
    tray = new Tray(path.join(global.__dirname, "icon.ico"));
    const contextMenu = Menu.buildFromTemplate([
      { label: "退出", click: () => { mainWindow.destroy(); app.quit(); } },
    ])
    tray.setToolTip("我的客戶端")
    tray.setContextMenu(contextMenu)
    tray.on("click", () => {
      if (mainWindow.isVisible()) {
        mainWindow.hide();
        mainWindow.setSkipTaskbar(false);
      } else {
        mainWindow.show();
        mainWindow.setSkipTaskbar(true);
      }
    })
  }

以上這些操作為我們的程序又增加了好幾層的防護措施,我們的程序就不會那么輕而易舉的掛掉啦!

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/99066.html

相關文章

  • electron + react + react-router + mobx + webpack 搭

    摘要:調試集成環境選擇模塊,簡單分離開發,測試,線上環境。程序保護開機自啟托盤最小化崩潰監控升級一行代碼接入升級平臺,實現客戶端升級功能打包構建一個指令搞定打包項目地址 項目地址 : https://github.com/ConardLi/electron-react electron-react electron + react + react-router + mobx + webpac...

    pingan8787 評論0 收藏0
  • electron實現開機自啟+通過鏈接調起應用

    摘要:實現原理通過修改注冊表來實現開機自啟和通過鏈接調起應用類似百度網盤點擊連接打開應用程序使用到的插件使用說明將下方例子中的替換為自己的應用別名可以不為名稱開機自啟開機自啟動查看開機自啟注冊表是否已經注冊未注冊或注冊地址與現地址不一致則進行注 實現原理 通過修改注冊表來實現開機自啟和通過鏈接調起應用(類似百度網盤點擊連接打開應用程序) 使用到的插件 node-regedit yarn ...

    DevTTL 評論0 收藏0
  • 使用 Electron 將應用程序放入托盤

    摘要:使用將應用程序放入托盤此系列文章的應用示例已發布于可以或下載后運行查看歡迎使用模塊允許您在操作系統的通知區域中創建圖標此圖標還可以附加上下文菜單在瀏覽器中查看完整文檔托盤支持進程示例按鈕使用模塊向主進程發送消息在主進程中應用程序會被告 使用 Electron 將應用程序放入托盤 此系列文章的應用示例已發布于 GitHub: electron-api-demos-Zh_CN. 可以 Cl...

    XGBCCC 評論0 收藏0
  • 提高云服務器安全等級的七個措施

    摘要:下面就來分享提高云中服務器的安全等級的個措施,讓企業有針對性的進行安全防護。對服務器安全而言,安裝防火墻非常必要。防火墻對于非法訪問具有很好的預防作用,但是安裝了防火墻并不等于服務器安全了。 近年以來,云計算已成為信息安全界的寵兒,各家企業前仆后繼的躋身于云行列中去。 云技術的出現,確實帶給了現代企業非常大的便利,但與好處伴隨而來的,也有不能回避的信息安全隱患。 下面就來分享提高云中服...

    cc17 評論0 收藏0

發表評論

0條評論

2i18ns

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<