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

更新 發佈閱讀 9 分鐘

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

上一章節回顧
第一章:顯示 Electron 視窗,可調整透明度
第二章:參數維護移植到 main/js
第三章:增加調整顏色功能

本章節內容
隱藏 electron 應用程式視窗,讓他看起來就是一個遮罩


0. 開啟 src/main.js

1. 調整 BrowserWindow 設定 - frame 設成 false

移除視窗邊框

const win = new BrowserWindow({
...
frame: false,
...
})

執行 npm start
✅ 確認上方工具列消失了,試著把其他應用程式往遮罩拖,應該會被擋住因為有 win.setAlwaysOnTop(true, 'screen-saver'); 設定
...嗯, 有點困擾呢

2. 調整 BrowserWindow 設定 - transparent 設成 true

開啟視窗透明

const win = new BrowserWindow({
...
transparent: true, // 開啟視窗透明
...
})

執行 npm start
✅ 試著把其他應用程式往遮罩拖,可以看到遮罩後的應用程式了但是拖不回來因為有 win.setAlwaysOnTop(true, 'screen-saver'); 設定
被遮罩擋住了...
...嗯, 有點困擾呢

3. win 設定忽略滑鼠事件

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

執行 npm start
✅ 試著把其他應用程式往遮罩拖,可以自由拖移
✅ 試著打字也 ok
可是遮罩的右上面板點不到捏...

4. 增加 點擊穿透與互動

若要讓控制面板可點擊但背景穿透,需監聽滑鼠是否進入面板區域,並動態調用
 win.setIgnoreMouseEvents(false)

在 index.html 的面板增加 滑鼠事件監聽

  1. 設定面板 id="control-panel",以便抓取
    ...
    <div
    id="control-panel"
    class="fixed top-4 right-4 p-4 bg-white/80 backdrop-blur rounded-xl shadow hover:opacity-100 opacity-20 transition-opacity z-10"
    >
    <label class="block">
    透明度
    <input .... />
    </label>
    <label class="block">
    顏色
    <input type="color" id="colorInput" class="w-full" />
    </label>
    </div>
    ...
  2. <script> 取得 面板
const controlPanel = document.getElementById('control-panel')

3. 設定面板的滑鼠事件監聽

controlPanel.onmouseenter = () => alert('滑鼠進入面板')
controlPanel.onmouseleave = () => alert('滑鼠離開面板')

執行 npm start
滑鼠移到面板沒反應捏...原因是 main.js 的 win.setIgnoreMouseEvents(true)
4. ✅ 需將 setIgnoreMouseEvents 設定改為

win.setIgnoreMouseEvents(true, { forward: true })
(可詳見 📚 額外筆記)
執行 npm start
✅ 滑鼠移到面板,成功跳出 alert

  1. 以 onmouseenteronmouseleave 動態設定 setIgnoreMouseEvents
controlPanel.onmouseenter = () => ipcRenderer.send('set-ignore-mouse', false)
controlPanel.onmouseleave = () => ipcRenderer.send('set-ignore-mouse', true)
  1. main.js 接收 set-ignore-mouse 事件,設定 setIgnoreMouseEvents
// src/main.js
ipcMain.on('set-ignore-mouse', (event, active) => {
win.setIgnoreMouseEvents(active, { forward: true })
})

📚 額外筆記

關於 setIgnoreMouseEvents 設定

setIgnoreMouseEvents 接收 2 個參數 (ignore: boolean, options: Electron.IgnoreMouseEventsOptions)

  • 第一個參數如果是 true,代表
    「不管滑鼠在哪裡,所有的點擊(Click)、按壓(MouseDown)都直接傳給後面的視窗。」
  • 第二個參數 options 含有一個 forward 的設定
    • false (預設),意思是: 滑鼠點擊穿透,且你的視窗 完全不會 觸發任何滑鼠事件(如 mousemove)。
    • true,意思是: 滑鼠點擊依然會穿透(點到後面的東西),但你的視窗 依然會觸發 滑鼠移動事件。

當設定 win.setIgnoreMouseEvents(true, { forward: true })
會遇到一個問題:

🧠 我可以 onmouseenteronmouseleave,為什麼不能控制面板?

這觸及了 作業系統層級 (OS) 與 瀏覽器渲染引擎 (Chromium) 之間的分工邏輯。
簡單來說:「點擊」需要所有權(Focus/Capture),但「移動」只需要座標(Coordinates)
當設定 { forward: true } 時,Electron 實際上是在背後做了一套「雙重轉發」:

  • 作業系統端: 當滑鼠移動到你的視窗上方時,因為 setIgnoreMouseEvents(true),作業系統原本會直接把事件丟給後面的視窗(例如資料夾)。
  • Electron 的轉發: 但因為有了 { forward: true },作業系統在把事件丟給後方的同時,也會「順便」抄送一份滑鼠座標給 Electron 視窗。
  • 瀏覽器解析: Electron 內部的 Chromium 引擎收到了這組座標,它會計算:「喔!滑鼠現在在座標 (100,200)(100,200),這剛好是我那個 div.control-panel 的範圍內。」
  • 觸發事件: Chromium 發現滑鼠從「外面」進入了「裡面」,於是幫你觸發了 mouseenter。這純粹是「資訊的共享」,不需要攔截滑鼠。

為什麼沒辦法操作拉桿(Slider)?
操作拉桿的本質不是移動,而是 「事件攔截(Event Interception)」

  • 操作 Slider 的流程: 按下鼠標 (mousedown) → 保持按住 → 移動 (mousemove) → 鬆開 (mouseup)。
  • 斷在哪裡? 斷在第一步 mousedown
  • 現實情況: 當你點擊拉桿時,作業系統看到你的視窗標記為「忽略滑鼠事件」。所以它會把這個 mousedown 直接傳給後面的程式
  • 結果: 你的拉桿從頭到尾都沒收到「被點擊」的訊號,它以為沒人理它。
留言
avatar-img
李昀瑾的沙龍
0會員
37內容數
李昀瑾的沙龍的其他內容
2026/04/09
前言 公司最近配的一台螢幕,沒辦法調整亮度,亮得要命,眼睛要瞎掉了 所以只好自立自強搞一個螢幕遮罩 上一章節回顧 第一章:顯示 Electron 視窗,可調整透明度 第二章:參數維護移植到 main/js 本章節內容 增加調整顏色功能
2026/04/09
前言 公司最近配的一台螢幕,沒辦法調整亮度,亮得要命,眼睛要瞎掉了 所以只好自立自強搞一個螢幕遮罩 上一章節回顧 第一章:顯示 Electron 視窗,可調整透明度 第二章:參數維護移植到 main/js 本章節內容 增加調整顏色功能
2026/04/02
前言 公司最近配的一台螢幕,沒辦法調整亮度,亮得要命,眼睛要瞎掉了所以只好自立自強搞一個螢幕遮罩 上一章節回顧 第一章:顯示 Electron 視窗,可調整透明度 本章節內容 參數維護移植到 main/js
2026/04/02
前言 公司最近配的一台螢幕,沒辦法調整亮度,亮得要命,眼睛要瞎掉了所以只好自立自強搞一個螢幕遮罩 上一章節回顧 第一章:顯示 Electron 視窗,可調整透明度 本章節內容 參數維護移植到 main/js
2026/03/26
前言 公司最近配的一台螢幕,沒辦法調整亮度,亮得要命,眼睛要瞎掉了 所以只好自立自強搞一個螢幕遮罩 本章節內容 顯示 Electron 視窗,可調整透明度
Thumbnail
2026/03/26
前言 公司最近配的一台螢幕,沒辦法調整亮度,亮得要命,眼睛要瞎掉了 所以只好自立自強搞一個螢幕遮罩 本章節內容 顯示 Electron 視窗,可調整透明度
Thumbnail
看更多
你可能也想看
Thumbnail
《轉轉生》(Re:INCARNATION)為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,結合拉各斯街頭節奏、Afrobeat/Afrobeats、以及約魯巴宇宙觀的非線性時間,建構出關於輪迴的「誕生—死亡—重生」儀式結構。本文將從約魯巴哲學概念出發,解析其去殖民的身體政治。
Thumbnail
《轉轉生》(Re:INCARNATION)為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,結合拉各斯街頭節奏、Afrobeat/Afrobeats、以及約魯巴宇宙觀的非線性時間,建構出關於輪迴的「誕生—死亡—重生」儀式結構。本文將從約魯巴哲學概念出發,解析其去殖民的身體政治。
Thumbnail
網站開發專案成功的關鍵在於與客戶的有效溝通。本文分享一個成功案例,說明如何透過明確掌握專案需求、主動提供技術方案、定期回報進度、完善技術協助及建立良好客戶關係,順利完成一個中文影片學習分享網站的建置,並獲得客戶高度滿意與後續合作機會。
Thumbnail
網站開發專案成功的關鍵在於與客戶的有效溝通。本文分享一個成功案例,說明如何透過明確掌握專案需求、主動提供技術方案、定期回報進度、完善技術協助及建立良好客戶關係,順利完成一個中文影片學習分享網站的建置,並獲得客戶高度滿意與後續合作機會。
Thumbnail
這份是我在使用Lovable做網站時,邊做邊紀錄的完整攻略,分享給需要的人。 給開發者/接案者的前言: Lovable 是一個強大的 AI 全端開發工具,要用它來賺錢,您必須清楚它的邊界在哪裡。這份指南將協助您完全掌控這個工具,從而自信地向客戶報價。 第一章:深度認識 Lovable 1.1
Thumbnail
這份是我在使用Lovable做網站時,邊做邊紀錄的完整攻略,分享給需要的人。 給開發者/接案者的前言: Lovable 是一個強大的 AI 全端開發工具,要用它來賺錢,您必須清楚它的邊界在哪裡。這份指南將協助您完全掌控這個工具,從而自信地向客戶報價。 第一章:深度認識 Lovable 1.1
Thumbnail
這是一場從「網路連結 → 線下見面」的活動,我一開始其實有些猶豫,畢竟地點對我來說不近,加上平常在社群裡其實不太主動互動。 但因為主辦人西打誠意滿滿地邀請,甚至還提出補貼車資,最後我決定自費參加。現在回頭看,真的很值得! 場地很有感,氛圍超溫暖 一踏進場地就被暖黃的燈光包圍,小閣樓超舒適,還
Thumbnail
這是一場從「網路連結 → 線下見面」的活動,我一開始其實有些猶豫,畢竟地點對我來說不近,加上平常在社群裡其實不太主動互動。 但因為主辦人西打誠意滿滿地邀請,甚至還提出補貼車資,最後我決定自費參加。現在回頭看,真的很值得! 場地很有感,氛圍超溫暖 一踏進場地就被暖黃的燈光包圍,小閣樓超舒適,還
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
從實際應用中學習 Python 程式設計,提升技能並建立作品集。文章提供八個循序漸進的 Python 專案範例,涵蓋檔案操作、網路爬蟲、Web 應用、自動化腳本、數據分析、遊戲開發、API 互動及應用程式部署,並附上實戰建議及學習資源。
Thumbnail
從實際應用中學習 Python 程式設計,提升技能並建立作品集。文章提供八個循序漸進的 Python 專案範例,涵蓋檔案操作、網路爬蟲、Web 應用、自動化腳本、數據分析、遊戲開發、API 互動及應用程式部署,並附上實戰建議及學習資源。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News