Electron-桌面 App-螢幕遮罩(Screen mask) - 2

更新 發佈閱讀 9 分鐘

前言
公司最近配的一台螢幕,沒辦法調整亮度,亮得要命,眼睛要瞎掉了
所以只好自立自強搞一個螢幕遮罩

上一章節回顧
第一章:顯示 Electron 視窗,可調整透明度

本章節內容
參數維護移植到 main/js


第一步:以 overlaySettings 維護 opacity

  1. 開啟 src/main.js
  2. 增加 overlaySettings,設定 opacity
// src/main.js
const { app, BrowserWindow, screen } = require('electron');
const path = require('path');

// 維護 opacity
let overlaySettings = { // 👈 這裡設定
opacity: 0.9 // 故意調成 0.9 確認前端有吃到
}

function createWindow() {
...
  1. win 完成載入後,發送 init-settings 事件來傳遞 overlaySettings
const { app, BrowserWindow, screen } = require('electron')
const path = require('path')

let overlaySettings = {
opacity: 0.9,
}

function createWindow() {
...
win.loadFile(path.join(__dirname, 'index.html'))
win.once('ready-to-show', () => {
win.show()
win.setAlwaysOnTop(true, 'screen-saver')
// 當網頁載入完成後,把初始值丟給前端
win.webContents.send('init-settings', overlaySettings) // 👈 這裡設定
})
}

app.whenReady().then(createWindow)

第二步:接收 win 事件,初始化 --overlay-opacity

  1. 開啟 src/index.html
  2. <script> 重寫:
    使用 ipcRenderer 接收 win 事件,設定 opacityInput--overlay-opacity
<!-- src/index.html -->
<!DOCTYPE html>
<html lang="en">
....
</body>
...
<script>
const { ipcRenderer } = require('electron')
const overlay = document.getElementById('overlay')
const opacityInput = document.getElementById('opacityInput')

// 接收來自 main.js 的初始設定
ipcRenderer.on('init-settings', (event, settings) => {
opacityInput.value = settings.opacity
applyStyle(settings)
})

function applyStyle({ opacity }) {
document.body.style.setProperty('--overlay-opacity', opacity)
}
</script>
</body>
</html>

執行 npm start
✅ 確認顯示畫面灰偏黑,右上面板操作沒反應


第三步:綁定 opacityInput 的 輸入事件,向 main.js 傳遞最新參數

增加 handleUpdate 方法,監控 opacityInput 的 輸入事件
以 'upload-settings' 事件透過 ipcRenderer 發送最新參數給 main.js

<!-- src/index.html -->
<!DOCTYPE html>
<html lang="en">
....
</body>
...
<script>
const { ipcRenderer } = require('electron');
const overlay = document.getElementById('overlay');
const opacityInput = document.getElementById('opacityInput');

// 接收來自 main.js 的初始設定
ipcRenderer.on('init-settings', (event, settings) => {
opacityInput.value = settings.opacity;
applyStyle(settings);
});

function applyStyle({ opacity }) {
document.body.style.setProperty('--overlay-opacity', opacity);
}

function handleUpdate() {
const newSettings = {
opacity: opacityInput.value
}
applyStyle(newSettings);
ipcRenderer.send('upload-settings', newSettings);
}

opacityInput.oninput = handleUpdate;
</body>
</html>

第四步:main.js 接收到 upload-settings 事件附帶的最新參數

  1. 開啟 src/main.js
  2. 載入 ipcMain 物件
// src/main.js
const { app, BrowserWindow, screen, ipcMain } = require('electron')
...
  1. 增加 upload-settings 監聽事件
// src/main.js
const { app, BrowserWindow, screen, ipcMain } = require('electron')
const path = require('path')

let overlaySettings = {
opacity: 0.9,
}

function createWindow() {
const { width, height } = screen.getPrimaryDisplay().workAreaSize

const win = new BrowserWindow({
...
})

win.loadFile(path.join(__dirname, 'index.html'))
win.once('ready-to-show', () => {
win.show()
win.setAlwaysOnTop(true, 'screen-saver')
win.webContents.send('init-settings', overlaySettings)
})

// 👇 監聽來自前端的更新請求(當你在拉動拉霸時)
ipcMain.on('update-settings', (event, newSettings) => {
overlaySettings = { ...overlaySettings, ...newSettings }
})
}

app.whenReady().then(createWindow)

執行 npm start
✅ 右上面板操作,透明度會跟著改變

留言
avatar-img
李昀瑾的沙龍
0會員
37內容數
李昀瑾的沙龍的其他內容
2026/03/26
前言 公司最近配的一台螢幕,沒辦法調整亮度,亮得要命,眼睛要瞎掉了 所以只好自立自強搞一個螢幕遮罩 本章節內容 顯示 Electron 視窗,可調整透明度
Thumbnail
2026/03/26
前言 公司最近配的一台螢幕,沒辦法調整亮度,亮得要命,眼睛要瞎掉了 所以只好自立自強搞一個螢幕遮罩 本章節內容 顯示 Electron 視窗,可調整透明度
Thumbnail
2026/03/19
(進階) 搭配 Nano Stores 完成「過濾器按鈕」 index.astro 的 ALL 按鈕,改為 FilterButton.tsx 套用先前建立好的 techStore.js 1. 建立 FilterButton 元件 新增 src\components\FilterButton
2026/03/19
(進階) 搭配 Nano Stores 完成「過濾器按鈕」 index.astro 的 ALL 按鈕,改為 FilterButton.tsx 套用先前建立好的 techStore.js 1. 建立 FilterButton 元件 新增 src\components\FilterButton
2026/03/12
(進階) 搭配 Nano Stores 完成「即時搜尋」 靜態 HTML Client Component Vanilla JS / Framework JS
2026/03/12
(進階) 搭配 Nano Stores 完成「即時搜尋」 靜態 HTML Client Component Vanilla JS / Framework JS
看更多
你可能也想看
Thumbnail
網站開發專案成功的關鍵在於與客戶的有效溝通。本文分享一個成功案例,說明如何透過明確掌握專案需求、主動提供技術方案、定期回報進度、完善技術協助及建立良好客戶關係,順利完成一個中文影片學習分享網站的建置,並獲得客戶高度滿意與後續合作機會。
Thumbnail
網站開發專案成功的關鍵在於與客戶的有效溝通。本文分享一個成功案例,說明如何透過明確掌握專案需求、主動提供技術方案、定期回報進度、完善技術協助及建立良好客戶關係,順利完成一個中文影片學習分享網站的建置,並獲得客戶高度滿意與後續合作機會。
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
從實際應用中學習 Python 程式設計,提升技能並建立作品集。文章提供八個循序漸進的 Python 專案範例,涵蓋檔案操作、網路爬蟲、Web 應用、自動化腳本、數據分析、遊戲開發、API 互動及應用程式部署,並附上實戰建議及學習資源。
Thumbnail
從實際應用中學習 Python 程式設計,提升技能並建立作品集。文章提供八個循序漸進的 Python 專案範例,涵蓋檔案操作、網路爬蟲、Web 應用、自動化腳本、數據分析、遊戲開發、API 互動及應用程式部署,並附上實戰建議及學習資源。
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
5 月將於臺北表演藝術中心映演的「2026 北藝嚴選」《海妲・蓋柏樂》,由臺灣劇團「晃晃跨幅町」製作,本文將以從舞台符號、聲音與表演調度切入,討論海妲・蓋柏樂在父權社會結構下的困境,並結合榮格心理學與馮.法蘭茲對「阿尼姆斯」與「永恆少年」原型的分析,理解女人何以走向精神性的操控、毀滅與死亡。
Thumbnail
5 月將於臺北表演藝術中心映演的「2026 北藝嚴選」《海妲・蓋柏樂》,由臺灣劇團「晃晃跨幅町」製作,本文將以從舞台符號、聲音與表演調度切入,討論海妲・蓋柏樂在父權社會結構下的困境,並結合榮格心理學與馮.法蘭茲對「阿尼姆斯」與「永恆少年」原型的分析,理解女人何以走向精神性的操控、毀滅與死亡。
Thumbnail
這份是我在使用Lovable做網站時,邊做邊紀錄的完整攻略,分享給需要的人。 給開發者/接案者的前言: Lovable 是一個強大的 AI 全端開發工具,要用它來賺錢,您必須清楚它的邊界在哪裡。這份指南將協助您完全掌控這個工具,從而自信地向客戶報價。 第一章:深度認識 Lovable 1.1
Thumbnail
這份是我在使用Lovable做網站時,邊做邊紀錄的完整攻略,分享給需要的人。 給開發者/接案者的前言: Lovable 是一個強大的 AI 全端開發工具,要用它來賺錢,您必須清楚它的邊界在哪裡。這份指南將協助您完全掌控這個工具,從而自信地向客戶報價。 第一章:深度認識 Lovable 1.1
Thumbnail
這是一場從「網路連結 → 線下見面」的活動,我一開始其實有些猶豫,畢竟地點對我來說不近,加上平常在社群裡其實不太主動互動。 但因為主辦人西打誠意滿滿地邀請,甚至還提出補貼車資,最後我決定自費參加。現在回頭看,真的很值得! 場地很有感,氛圍超溫暖 一踏進場地就被暖黃的燈光包圍,小閣樓超舒適,還
Thumbnail
這是一場從「網路連結 → 線下見面」的活動,我一開始其實有些猶豫,畢竟地點對我來說不近,加上平常在社群裡其實不太主動互動。 但因為主辦人西打誠意滿滿地邀請,甚至還提出補貼車資,最後我決定自費參加。現在回頭看,真的很值得! 場地很有感,氛圍超溫暖 一踏進場地就被暖黃的燈光包圍,小閣樓超舒適,還
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News