使用Electron获取用户信息,监听程序打开,用户退出连接关闭程序【全代码,有图】

news/2024/12/23 22:22:57 标签: electron, javascript, 前端

使用Electron获取用户信息,监听程序打开,用户退出连接关闭程序【全代码,有图】

效果图

如有其他操作可在代码中自己添加
在这里插入图片描述

main.js

const { app, BrowserWindow, ipcMain } = require('electron');
const path = require('node:path');
const os = require('os');
const { exec } = require('child_process');

let intervalId;

const createWindow = () => {
    const win = new BrowserWindow({
        width: 800,
        height: 600,
        autoHideMenuBar: true,
        webPreferences: {
            preload: path.join(__dirname, 'preload.js'),
        }
    });

    win.loadFile('view/index.html');

    // 确保窗口完全加载后发送用户信息
    win.once('ready-to-show', () => {
        LogsInUser(win);  // 发送登录用户信息
    });
};

app.on('window-all-closed', () => {
    if (process.platform !== 'darwin') app.quit();
});

app.whenReady().then(() => {
    // 订阅消息
    ipcMain.handle('getWindowsUser', getWindowsUser);

    createWindow();
    app.on('activate', () => {
        if (BrowserWindow.getAllWindows().length === 0) createWindow();
    });

    // 每 5 秒获取登录用户信息
    startUserCheck();
});


function getWindowsUser() {
    const userDomain = process.env.USERDOMAIN || 'UNKNOWN_DOMAIN';//用于获取当前用户的域名或工作组名称
    const username = os.userInfo().username; // 获取用户名
    return `${userDomain}---${username}`; // 返回域账号格式
}

function LogsInUser(win) {
    if (win) {
        // 将用户信息发送到前端
        win.webContents.send('LogsInUser', os.userInfo().username);
    };
}


// 启动用户检查函数,每 5 秒执行一次
function startUserCheck() {
    intervalId = setInterval(() => {
        // 每次检查获取当前登录的用户
        getLoggedInUsers();
    }, 5000);
}

// 获取当前登录用户信息并判断其状态
function getLoggedInUsers() {
    const username = os.userInfo().username;

    // 如果 username 为空,退出程序
    if (!username) {
        console.log('Username is empty, exiting...');
        clearInterval(intervalId);
        app.quit();
        return;
    }

    // 使用 Windows 命令检查用户是否连接
    checkUserConnection(username, (isConnected) => {
        if (!isConnected) {
            console.log(`${username} is disconnected, exiting...`);
            clearInterval(intervalId);
            app.quit();
        } else {
            console.log(`Logged in user: ${username} is still connected`);
            const win = BrowserWindow.getAllWindows()[0];
            if (win) {
                win.webContents.send('userLoggedIn', username);
            }
        }
    });
}

// 使用 Windows 命令行检查当前用户连接状态
function checkUserConnection(username, callback) {
    exec('chcp 65001 && qwinsta', { encoding: 'utf8' }, (error, stdout, stderr) => {

        if (error || stderr) {
            return callback(false); // 如果出错,认为用户断开
        }

        // 去除 stdout 中的多余空格和换行符
        const cleanedStdout = stdout.replace(/\s+/g, ' ').trim();

        // 正则表达式匹配当前用户的行,查找状态为 "Active" 或 "Disc" 的用户
        const userPattern = new RegExp(`(\\S+)\\s+(${username})\\s+\\d+\\s+(Active|Disc|Disconnected)`, 'i');

        const matches = cleanedStdout.match(userPattern);

        if (matches && matches[3] === 'Active') {
            callback(true); // 如果用户是活跃状态
        } else {
            callback(false); // 否则认为用户断开
        }
    });
}

preload.js

const { contextBridge,ipcRenderer } = require('electron')

contextBridge.exposeInMainWorld('myApi', {
    getWindowsUser: () => {
        return ipcRenderer.invoke('getWindowsUser')
    },
    userLoggedIn: (callback) => {
        ipcRenderer.on('userLoggedIn', (event, data) => {
            callback(data);
        });
    },
    LogsInUser: (callback) => {
        ipcRenderer.on('LogsInUser', (event, data) => {
            callback(data);
        });
    }
})

render.js

const btn1 = document.getElementById('btn1')

const logContainer = document.getElementById('logContainer');
const LogsText = document.getElementById('LogsText');


btn1.onclick= async ()=>{
    let data= await myApi.getWindowsUser()
    //获取node的api
    alert(data)
}


// 初始化时设置用户事件监听
myApi.userLoggedIn((data) => {
    const logText = `用户: ${data}, 时间: ${new Date().toLocaleString()}`;
    const logElement = document.createElement('p');
    logElement.textContent = logText;
    logContainer.appendChild(logElement);
});

// 初始化时设置用户事件监听
myApi.LogsInUser((data) => {
    const logText = `用户: ${data}, 时间: ${new Date().toLocaleString()}`;
    const logElement = document.createElement('p');
    logElement.textContent = logText;
    LogsText.appendChild(logElement);
});

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self'">
    <title>超级无敌炫酷闪光智能高端产品</title>
    <link rel="stylesheet" href="../style/index.css">
</head>
<body>
<div class="textStyle">
    Hello Electron!
</div>

<div>
    <hr>
    <button id="btn1">获取本机账号信息</button>
    <hr>
    <div id="LogsText">
        日志记录
        <!-- 用户连接与断开信息将在这里显示 -->
    </div>
    <hr>
    <div id="logContainer">
        检测连接
        <!-- 用户连接与断开信息将在这里显示 -->
    </div>
</div>

<script type="text/javascript" src="./render.js" ></script>
</body>
</html>


http://www.niftyadmin.cn/n/5797070.html

相关文章

【计算机视觉基础CV-图像分类】03-深度学习图像分类实战:鲜花数据集加载与预处理详解

本文将深入介绍鲜花分类数据集的加载与处理方式&#xff0c;同时详细解释代码的每一步骤并给出更丰富的实践建议和拓展思路。以实用为导向&#xff0c;为读者提供从数据组织、预处理、加载到可视化展示的完整过程&#xff0c;并为后续模型训练打下基础。 前言 在计算机视觉的深…

基于单片机的步进电机控制系统的设计研究

摘要 :随着我国社会经济结构的不断优化与升级,加工制造工业得到了长足发展 。 加工制造工业体系的日益成熟,使得步进电机应用的范围越来越广泛,逐渐成为工业生产与社会生活中必不可少的工业组成。 因此如何提升步进电机的性能、 实现步进电机控制系统的科学设计,就成为现阶…

Docker 部署机器学习模型

1.编写机器学习代码 &#xff08;1&#xff09;新建一个 mlmodel.py import numpy as np import pandas as pd from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression from sk…

127、SQLSERVE中union all 和union的使用场景

使用&#xff1a;在 SQL Server 中&#xff0c;UNION 和 UNION ALL 是用于合并两个或多个 SELECT 查询结果的操作符。两者区别union all 会去重&#xff0c;union 不会去重例子&#xff1a; 两张表&#xff1a;stu:stu_id,name emplyee:em_id,name 需求1&#xff1a;sql实…

设计模式中单例模式中懒汉模式的问题

设计模式中单例模式中懒汉模式的问题 今天在项目中遇到了要使用懒汉模式的问题。百度之后&#xff0c;发现还有很多细节是自己之前没有见过的。于是记录一下。下面是在AI助手中的说明。 单例模式的懒汉模式&#xff08;Lazy Singleton&#xff09;是在需要时才创建实例&#…

深入了解Java在人工智能领域的最新应用

Java不仅是传统企业级开发的主要语言&#xff0c;在人工智能&#xff08;AI&#xff09;领域也表现出强大的适应能力。随着AI技术的飞速发展&#xff0c;Java在机器学习框架、大数据分析以及深度学习中发挥了重要作用。本文将重点介绍Java在AI领域的最新进展与实际应用场景。 …

初始化全部推断的寄存器、 SRL 和存储器

初始化全部推断的寄存器、 SRL 和存储器 GSR 网络用于根据 HDL 代码中规定的初始值完成所有寄存器的初始化。如果没有设定初始值&#xff0c;综合工具会自行将初始 状态赋值为 0 或 1 。除少数情况&#xff0c;比如 one-hot 状态机编码&#xff0c; Vivado 综合工具一…

随时随地编码,高效算法学习工具—E时代IDE

随着算法学习的日益普及以及在线竞赛的增多&#xff0c;越来越多的算法爱好者需要一个便捷、高效的在线编码工具。而E时代IDE的出现&#xff0c;正是为了满足这些需求。无论你是在地铁上、咖啡馆&#xff0c;还是在课堂间隙&#xff0c;都可以通过这个工具快速投入算法编程。本…