You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux系统下Electron.js窗口点击按钮触发Node.js屏幕亮度调节函数的可行性及实现方法

在Electron应用中实现Linux屏幕亮度调节功能

完全可以实现这个需求!不过要注意两个核心点:Electron的进程通信规则,以及Linux下修改系统亮度文件的权限问题。我来一步步帮你搞定:

1. 先搞懂Electron的进程模型

Electron里的渲染进程(就是你的HTML/JS运行的环境)默认不能直接调用Node.js的fs模块操作系统文件(这是安全限制)。所以我们需要把亮度调节的逻辑放到主进程中,然后通过IPC(进程间通信)让渲染进程的按钮触发主进程的操作。

2. 调整代码实现IPC通信

第一步:主进程代码(比如main.js)

把你的亮度调节逻辑移到主进程,同时监听渲染进程的请求:

const { app, BrowserWindow, ipcMain } = require('electron');
const fs = require('fs');

// 注意:根据你的显卡型号,这个路径可能不同,先确认下
const BRIGHTNESS_PATH = '/sys/class/backlight/amdgpu_bl1/brightness';

// 通用的亮度调整函数
function adjustBrightness(delta) {
  try {
    const currentBrightness = parseInt(fs.readFileSync(BRIGHTNESS_PATH, 'utf-8'));
    let newBrightness = currentBrightness + delta;
    // 限制亮度在0-255之间
    newBrightness = Math.max(0, Math.min(255, newBrightness));
    fs.writeFileSync(BRIGHTNESS_PATH, newBrightness.toString(), 'utf-8');
    return true;
  } catch (err) {
    console.error('亮度调整失败:', err);
    return false;
  }
}

let mainWindow;

function createWindow() {
  mainWindow = new BrowserWindow({
    width: 200,
    height: 100,
    webPreferences: {
      contextIsolation: true, // 安全最佳实践,必须开启
      preload: `${__dirname}/preload.js` // 预加载脚本,用于IPC通信
    }
  });

  mainWindow.loadFile('index.html');
}

// 监听渲染进程的亮度调整请求
ipcMain.handle('increase-brightness', () => adjustBrightness(10));
ipcMain.handle('decrease-brightness', () => adjustBrightness(-10));

app.whenReady().then(createWindow);

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

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

第二步:预加载脚本(preload.js)

因为开启了上下文隔离,我们需要通过预加载脚本把主进程的API暴露给渲染进程:

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

// 给渲染进程暴露亮度调节的API
contextBridge.exposeInMainWorld('brightnessAPI', {
  increase: () => ipcRenderer.invoke('increase-brightness'),
  decrease: () => ipcRenderer.invoke('decrease-brightness')
});

第三步:修改渲染进程的script.js

绑定按钮的点击事件,调用我们暴露的API:

async function incBright() {
  await window.brightnessAPI.increase();
}

async function decBright() {
  await window.brightnessAPI.decrease();
}

你的HTML代码不用改,保持原来的onclick="incBright()"和onclick="decBright()"就行。

3. 解决Linux下的权限问题

Linux的/sys/class/backlight/xxx/brightness文件需要root权限才能写入,直接运行Electron应用会报错,这里有两种安全的解决方式:

方式一:给脚本单独提权(推荐)

创建一个单独的shell脚本adjust-brightness.sh:

#!/bin/bash
BRIGHTNESS_PATH="/sys/class/backlight/amdgpu_bl1/brightness"
DELTA=$1

CURRENT=$(cat $BRIGHTNESS_PATH)
NEW=$((CURRENT + DELTA))
# 限制亮度范围
NEW=$((NEW < 0 ? 0 : NEW > 255 ? 255 : NEW))

echo $NEW > $BRIGHTNESS_PATH

给脚本加执行权限:

chmod +x adjust-brightness.sh

然后修改主进程的adjustBrightness函数,用pkexec运行这个脚本(会弹出系统权限验证窗口):

const { execSync } = require('child_process');

function adjustBrightness(delta) {
  try {
    execSync(`pkexec /path/to/adjust-brightness.sh ${delta}`);
    return true;
  } catch (err) {
    console.error('亮度调整失败:', err);
    return false;
  }
}

方式二:给Electron二进制文件设置setuid(不推荐,除非你信任应用)

找到你的Electron二进制文件路径(比如node_modules/electron/dist/electron),执行:

sudo chown root:root /path/to/electron
sudo chmod u+s /path/to/electron

这样运行应用时会自动以root权限执行,不需要每次输入密码,但要注意安全风险。

额外注意事项

  • 确认你的亮度文件路径正确:可以通过ls /sys/class/backlight/查看系统里的背光设备路径,Intel显卡一般是intel_backlight,AMD就是你用的amdgpu_bl1。
  • 不要关闭contextIsolation,这是Electron的安全最佳实践,避免渲染进程被恶意脚本利用。

内容的提问来源于stack exchange,提问作者Gourav Chouhan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 16:47:45