Per Default schaltet das System Display und CPU nach inaktivität ab. Für Apps, bei denen das stört — Video-Player, Audio-Renderer, lang laufende Encoder — bietet powerSaveBlocker eine API, das gezielt zu blockieren.
Zwei Modi
| Mode | Verhindert | Use-Case |
|---|---|---|
prevent-display-sleep | Display-Sleep | Video-Wiedergabe, Präsentation |
prevent-app-suspension | App-Suspension durch OS | Background-Encoding, Downloads |
prevent-display-sleep impliziert prevent-app-suspension — strikteres Mode. Schwächere Variante reicht für reine Background-Tasks.
Grundbeispiel
import { powerSaveBlocker } from 'electron';
// Beim Start des Videos
const id = powerSaveBlocker.start('prevent-display-sleep');
// Status prüfen
const isActive = powerSaveBlocker.isStarted(id);
// Beim Ende stoppen
powerSaveBlocker.stop(id);start gibt eine Block-ID zurück. Mit der ID stoppst du gezielt — wichtig, weil mehrere Blocks parallel aktiv sein können.
Pattern: Video-Player
let blockerId = null;
ipcMain.on('video:play', () => {
if (blockerId === null) {
blockerId = powerSaveBlocker.start('prevent-display-sleep');
}
});
ipcMain.on('video:pause', () => {
if (blockerId !== null) {
powerSaveBlocker.stop(blockerId);
blockerId = null;
}
});
// Cleanup beim Quit
app.on('will-quit', () => {
if (blockerId !== null) powerSaveBlocker.stop(blockerId);
});Wichtig: die ID merken und stop aufrufen — sonst bleibt das System wach, bis die App stirbt.
Mehrere parallele Blocks
// Blocker für Encoding-Job
const encodeId = powerSaveBlocker.start('prevent-app-suspension');
// Zusätzlich beim Vollbild-Video noch Display-Sleep verhindern
const displayId = powerSaveBlocker.start('prevent-display-sleep');
// Beim Encoding-Ende nur den einen stoppen
powerSaveBlocker.stop(encodeId);
// displayId bleibt aktiv, bis das Video pausiertJeder Block ist unabhängig. Erst wenn alle stops gerufen sind, schaltet das System wieder normal.
Plattform-Verhalten
| macOS | Windows | Linux | |
|---|---|---|---|
prevent-display-sleep | IOPMAssertion | SetThreadExecutionState | DBus zu org.freedesktop.ScreenSaver |
prevent-app-suspension | NSProcessInfo | ES_SYSTEM_REQUIRED | DBus zu Login1 |
| Funktioniert headless | Ja | Ja | Distro-abhängig |
Auf manchen Linux-Headless-Setups (Server ohne Window-Manager) gibt es keine entsprechende DBus-Service — powerSaveBlocker läuft durch, hat aber keinen Effekt.
Aus dem Renderer
let displayBlockId = null;
ipcMain.handle('power:keep-display-awake', (_event, enable) => {
if (enable && displayBlockId === null) {
displayBlockId = powerSaveBlocker.start('prevent-display-sleep');
} else if (!enable && displayBlockId !== null) {
powerSaveBlocker.stop(displayBlockId);
displayBlockId = null;
}
});contextBridge.exposeInMainWorld('api', {
keepDisplayAwake: (enable) => ipcRenderer.invoke('power:keep-display-awake', enable)
});Pattern: Renderer toggelt — der Main verwaltet die Block-ID, weil die im Renderer-Lifetime nicht überlebt.
FAQ
Wann prevent-display-sleep, wann prevent-app-suspension?
Display-Sleep: für visuelle Anwendungen, die User aktiv anschauen (Video, Präsentation, Live-Dashboard). App-Suspension: für unsichtbare Background-Operationen (Encoding, Sync, Downloads). Wer beides will: prevent-display-sleep ist die obere Stufe.
Beeinflusst der Blocker den Akku-Verbrauch?
Ja — wenn das Display nicht ausgeht, läuft der Backlight-Strom weiter. User sollte das wissen: bei einer „immer wach"-Funktion einen klaren Toggle anbieten und nicht heimlich aktivieren.
Stoppt das System die App trotzdem irgendwann?
macOS und Windows respektieren den Block, solange die App läuft. Nur „App im Hintergrund + macOS App Nap"-Logik kann manchmal eingreifen, falls die App keine sichtbaren Renderer hat. Tray-Apps mit Background-Encoding: prevent-app-suspension reicht.
Was passiert wenn ich stop nie rufe?
Block bleibt aktiv bis App-Quit. Bei Crash oder unsanftem Tod räumt das OS das nach kurzer Zeit auf. Trotzdem: explizit cleanen ist guter Stil — User-Akku dankt dir.
Funktioniert das mit Hibernation?
prevent-app-suspension blockt nur Sleep, nicht Hibernation. Wenn der User aktiv „Hibernate" wählt, geht die App schlafen. Das ist korrekt — Hibernation ist explizite User-Aktion, nicht passive Inaktivität.
Auf macOS: caffeinate als Alternative.
Wer keine Electron-Logik hat, kann child_process.spawn('caffeinate', ['-d']) nutzen — externes macOS-CLI-Tool. Macht das gleiche, aber ohne API-Abhängigkeit. Selten nötig, da powerSaveBlocker portable ist.
Weiterführende Ressourcen
Externe Quellen
- powerSaveBlocker
- powerMonitor — Power-Events lesen
- IOPMAssertion (Apple)