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

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 模块。如果还没有安装,可以使用以下命令进行安装:

bash 复制代码
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();
    });
});
前端代码
html 复制代码
<!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>
        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();
    });
});
前端代码
html 复制代码
<!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>
        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 的情况,特别适用于某些特殊情况下的进程管理。
相关推荐
触底反弹32 分钟前
🔥 字符串算法面试三连击:反转、回文、回文变种,搞懂这三题稳了!
前端·javascript·算法
触底反弹41 分钟前
AI Tool Use 深度解析:大模型是如何"突破物理限制"调用外部工具的?
javascript·人工智能·后端
竹林8181 小时前
从 RPC 超时到批量签名:我用 @solana/web3.js 重构了一个 NFT 铸造页面,踩了这些坑
前端·javascript
工业HMI实战笔记1 小时前
工业HMI界面布局“1核2辅”黄金结构,适配90%场景
前端·ui·性能优化·自动化·交互
橘子星1 小时前
从零手写 RAG 语义检索:基于 Node.js 实现轻量级向量搜索
javascript·人工智能
林希_Rachel_傻希希2 小时前
web性能优化之————图片效果
前端·javascript·面试
橘子星2 小时前
基于 MCP 协议实现本地文件读取工具服务开发实践
javascript·人工智能
Darling噜啦啦2 小时前
前端存储与 this 指向完全指南:从 LocalStorage 实战到 call/apply/bind 深度解析
前端·javascript
sugar__salt2 小时前
手撕字符串算法:反转、回文、验证回文 Ⅱ 完整拆解
javascript·算法·面试·职场和发展
wei1986212 小时前
.net添加web引用和添加服务引用有什么区别?
java·前端·.net