Electron 项目中杀掉进程的不同方式

news/2024/11/14 14:15:16/

Electron 项目中杀掉进程的不同方式

随着现代应用程序功能的不断扩展,用户对应用程序的控制需求也在不断增加。在 Electron 项目中,能够灵活地管理和控制进程是提升用户体验的重要一环。
无论是关闭不必要的后台任务,还是在特定条件下终止某个进程,掌握多种杀掉进程的方法都是非常有用的技能。本文将详细介绍在 Electron 项目中使用不同
方法杀掉进程的技术。我们将从多个角度详细讲解每种方法,并提供详细的代码示例。

目标
  1. 使用 process.kill 方法杀掉进程。
  2. 使用 child_process.exec 执行 taskkill 命令杀掉进程。
  3. 使用 child_process.exec 执行 taskkill 命令通过窗口标题杀掉进程。
章节
  1. 设置项目环境
  2. 使用 process.kill 方法杀掉进程
  3. 使用 child_process.exec 执行 taskkill 命令杀掉进程
  4. 使用 child_process.exec 执行 taskkill 命令通过窗口标题杀掉进程
  5. 总结

1. 设置项目环境

首先,确保你已经安装了 Electron 和 child_process 模块。如果还没有安装,可以使用以下命令进行安装:

npm install electron --save-dev

2. 使用 process.kill 方法杀掉进程

process.kill 是 Node.js 提供的一个内置方法,用于向进程发送信号。这是最简单和直接的方式。

示例代码
javascript">const { app, BrowserWindow } = require('electron');
const { spawn } = require('child_process');let mainWindow;
let childProcess;function createWindow() {mainWindow = new BrowserWindow({width: 800,height: 600,webPreferences: {nodeIntegration: true,contextIsolation: false,}});mainWindow.loadFile('index.html');
}app.on('ready', async () => {await createWindow();// 启动子进程childProcess = spawn('notepad.exe'); // 示例:启动记事本global.pid = childProcess.pid;// 杀掉进程function killProcess() {if (childProcess) {process.kill(childProcess.pid, 'SIGTERM'); // 发送终止信号childProcess = null;global.pid = undefined;console.log('已结束可执行程序的执行');}}// 绑定按钮事件mainWindow.webContents.on('did-finish-load', () => {mainWindow.webContents.send('init-kill-button');});mainWindow.webContents.on('kill-process', () => {killProcess();});
});
前端代码
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Electron Kill Process</title>
</head>
<body><h1>Electron Kill Process Example</h1><button id="kill-button">Kill Process</button><script>javascript">const { ipcRenderer } = require('electron');document.getElementById('kill-button').addEventListener('click', () => {ipcRenderer.send('kill-process');});ipcRenderer.on('init-kill-button', () => {console.log('Kill button initialized');});</script>
</body>
</html>

3. 使用 child_process.exec 执行 taskkill 命令杀掉进程

child_process.exec 方法允许你执行系统命令并获取输出。

示例代码
javascript">const { app, BrowserWindow } = require('electron');
const { exec } = require('child_process');let mainWindow;
let childProcess;function createWindow() {mainWindow = new BrowserWindow({width: 800,height: 600,webPreferences: {nodeIntegration: true,contextIsolation: false,}});mainWindow.loadFile('index.html');
}app.on('ready', async () => {await createWindow();// 启动子进程childProcess = exec('notepad.exe'); // 示例:启动记事本global.pid = childProcess.pid;// 杀掉进程function killProcess() {if (global.pid) {const killCommand = `taskkill /PID ${global.pid} /F /T`;exec(killCommand, (error, stdout, stderr) => {if (error) {console.log(`程序的执行在强制结束时发生错误: ${error.message}`);}if (stderr) {console.log(`程序的执行在强制结束时发生错误: ${stderr}`);}console.log(`已结束可执行程序的执行`);});global.pid = undefined;}}// 绑定按钮事件mainWindow.webContents.on('did-finish-load', () => {mainWindow.webContents.send('init-kill-button');});mainWindow.webContents.on('kill-process', () => {killProcess();});
});

4. 使用 child_process.exec 执行 taskkill 命令通过窗口标题杀掉进程

有时你可能没有进程 ID,但知道窗口标题,可以通过窗口标题来杀掉进程。

示例代码
javascript">const { app, BrowserWindow } = require('electron');
const { exec } = require('child_process');let mainWindow;function createWindow() {mainWindow = new BrowserWindow({width: 800,height: 600,webPreferences: {nodeIntegration: true,contextIsolation: false,}});mainWindow.loadFile('index.html');
}app.on('ready', async () => {await createWindow();// 杀掉进程function killProcessByWindowTitle() {const killCommand = `taskkill /fi "windowtitle eq 记事本" /F /T`;exec(killCommand, (error, stdout, stderr) => {if (error) {console.log(`程序的执行在强制结束时发生错误: ${error.message}`);}if (stderr) {console.log(`程序的执行在强制结束时发生错误: ${stderr}`);}console.log(`已结束可执行程序的执行`);});}// 绑定按钮事件mainWindow.webContents.on('did-finish-load', () => {mainWindow.webContents.send('init-kill-button');});mainWindow.webContents.on('kill-process-by-title', () => {killProcessByWindowTitle();});
});
前端代码
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Electron Kill Process</title>
</head>
<body><h1>Electron Kill Process Example</h1><button id="kill-button">Kill Process by PID</button><button id="kill-by-title-button">Kill Process by Window Title</button><script>javascript">const { ipcRenderer } = require('electron');document.getElementById('kill-button').addEventListener('click', () => {ipcRenderer.send('kill-process');});document.getElementById('kill-by-title-button').addEventListener('click', () => {ipcRenderer.send('kill-process-by-title');});ipcRenderer.on('init-kill-button', () => {console.log('Kill buttons initialized');});</script>
</body>
</html>

总结

本文介绍了在 Electron 项目中使用不同的方法来杀掉进程。具体方法包括:

  1. 使用 process.kill 方法杀掉进程:适用于已知进程 ID 的情况,操作简单且效率高。
  2. 使用 child_process.exec 执行 taskkill 命令杀掉进程:适用于已知进程 ID 的情况,提供了更多的灵活性和控制。
  3. 使用 child_process.exec 执行 taskkill 命令通过窗口标题杀掉进程:适用于已知窗口标题但不知道进程 ID 的情况,特别适用于某些特殊情况下的进程管理。

http://www.ppmy.cn/news/1546947.html

相关文章

通俗易懂:@Configuration 和 @Component 注解的区别

文章目录 Component&#xff1a;通用的组件注解什么情况下用 Component&#xff1f;注意&#xff1a; Configuration&#xff1a;专门用来定义配置的类为什么使用 Configuration&#xff1f; Configuration 和 Component 的区别举个例子 总结推荐阅读文章 在 Spring 中&#xf…

huawei初级网络工程师综合实验

本章为总结练习&#xff0c;只提供思路以及验证结果&#xff0c;和比较有难度的命令 并且在我的其他章节对本练习中出现的所有都有介绍这里就不重复解释了 拓扑图以及实验要求&#xff1a; sw1 充当2层交换机 sw-2&#xff08;undo portswitch&#xff09; 充当三册交换机 R…

RoseTTAFold QueryEncoding类解读

QueryEncoding 类用于在输入张量 x 上添加一种查询序列的特殊编码。这里的查询编码将第一个序列标记为查询序列&#xff0c;并将其与其他序列区分开。以下是代码中的细节和每一步的作用。 源码&#xff1a; class QueryEncoding(nn.Module):def __init__(self, d_model):supe…

JavaScript代理實現Web開發和安全流覽

在Web 開發中&#xff0c;JavaScript代理&#xff08;JS 代理&#xff09;是指一種允許開發人員攔截和重新定義對對象執行的操作的機制。JavaScript 代理充當對象的包裝器&#xff0c;攔截某些操作&#xff08;如屬性訪問、方法調用等&#xff09;&#xff0c;開發人員可以控制…

2020年美国总统大选数据分析与模型预测

数据集取自&#xff1a;2020年&#x1f1fa;&#x1f1f8;&#x1f1fa;&#x1f1f8;美国大选数据集 - Heywhale.com 前言 对2020年美国总统大选数据的深入分析&#xff0c;提供各州和县层面的投票情况及选民行为的可视化展示。数据预处理阶段将涉及对异常值的处理&#xff0…

有了Makefile, CMake存在的意义是什么?如何借助Makefile构建ObjC语言编译环境?如何获取编译器的版本号?

有了Makefile, CMake存在的意义是什么? Makefile规定了编译脚本的基本长相&#xff0c;但随着跨平台需求越来越大&#xff0c;一份Makefile想要跨平台给Windows/Linux/Mac等等平台越来越难&#xff0c;需要维护的工作量越来越大。CMake定义了makefile中跨平台需要的公用组成&a…

安卓APP又可以在电脑上运行了:微软和鹅厂合作,Windows上运行安卓APP!

手机App如何才能在PC端使用&#xff1f;想必这个问题曾困扰过部分用户&#xff0c;基于操作系统差异和应用开发的兼容性等问题&#xff0c;要实现这个愿望看似遥不可及&#xff0c;好在技术的发展也带来了一些互通解决方案&#xff0c;比如在 PC 端安装安卓模拟器。用户只需下载…

opencv(c++)图像的灰度转换

opencv(c)图像的灰度转换 quickopencv.h #pragma once #include <opencv2/opencv.hpp> using namespace cv; class QuickDemo { public:void colorSpace_Demo(Mat& image); };quickopencv.cpp #include "quickopencv.h"// QuickDemo类中的颜色空间演示函…