# 运行过程

程序的入口为 main.js

启动步骤的相关代码如下:

(() => {
  log.info("==================== 程序开始执行");
  log.info("程序开始执行: " + (Date.now() - start) + "ms");
  //生成存储应用信息的目录
  Utils.createAppDataDir();
  //处理异常, 报错. 弹框提示错误和日志记录错误
  recordException();
  // 初始化Url唤醒
  initUrlLaunch();
  //单实例应用. 禁止多个同时运行
  limitSingleApp();
  // 获取是否能使用日志功能
  initEnableLog();
  // 初始化应用
  initApp();
})();

需要重点看一下,初始化应用 中的 setAppEvent 事件。

# 生成存储应用信息的目录

  • Utils.createAppDataDir();

如题:生成致信文件夹,具体请用搜索找到代码查看。

# 处理异常, 报错. 弹框提示错误和日志记录错误

  • recordException()

报错捕捉,并且记录到日志中,方便进行分析。

# 初始化 Url 唤醒

  • initUrlLaunch()

初始化致信穿透,比如 zhixin://xxxx123123132

// 初始化URL唤醒
function initUrlLaunch() {
  log.info("初始化URL唤醒 START: " + (Date.now() - start) + "ms");
  if (process.defaultApp) {
    if (process.argv.length >= 2) {
      app.setAsDefaultProtocolClient("zhixin", process.execPath, [
        path.resolve(process.argv[1]),
      ]);
    }
  } else {
    app.setAsDefaultProtocolClient("zhixin");
  }
  log.info("初始化URL唤醒 END: " + (Date.now() - start) + "ms");
}

# 单实例应用. 禁止多个同时运行

  • initEnableLog()

防止启动多个致信程序,并且捕获通过浏览器穿透过来的 url 参数。

# 初始化应用

  • initApp()

加载窗口,加载事件监听,加载各种模块等。

# 初始化浏览器设置

  • setBrowserCommandLine()

设置浏览器信息,比如浏览器是否开启代理

# 改变当前应用的 AppUserModelId

  • setAppUserModelId()

设置 AppUserModelId,也就是 APP 特定的 APPID

# 重要!!!!加载窗口,加载截图模块等

  • setAppEvent()

具体请见 setAppEvent

# setAppEvent(主要)

AppEvent 大概分为 3 个步骤

  1. ready 程序加载之前 app.on('ready', appReady);
  2. activate 程序加载完成,激活 app.on('activate', appActivate);
  3. before-quit 程序退出之前执行 app.on('before-quit', appBeforeQuit);

# appReady

appReady 执行步骤如下

# 国际化多语言设置

initLocales();

# 复制一份 .node 文件, 供运行使用

copyNodeFile();

# 引入需要在主进程运行的模块

loadModules();

# 创建主窗口

createMainWindow();

# 创建等待页面窗口(已屏蔽)

createLoadingWindow();

# 创建图片查看器页面和视频查看器页面

setTimeout(() => {
  createPreviewImgWindow();
  createPreviewVideoWindow();
}, 10);

# 创建托盘

createTray();

# 监听渲染进程事件

setIpcEvents();