Das clipboard-Modul gibt vollen Zugriff auf das System-Clipboard — Text, Bilder, HTML, Custom-Formate. Anders als die meisten Module funktioniert es sowohl im Main- als auch im Renderer-Prozess identisch (mit nodeIntegration: true oder via Preload). Hier alle Operationen im Detail.
Text
import { clipboard } from 'electron';
// Schreiben
clipboard.writeText('Hallo Welt');
// Lesen
const text = clipboard.readText();
console.log(text); // 'Hallo Welt'
// Mit Type-Argument (selten gebraucht)
clipboard.writeText('selection-only', 'selection'); // Linux X11'selection' ist Linux-spezifisch (X11 Primary Selection — Mittelklick-Buffer). Auf macOS und Windows ignoriert.
Bilder
import { clipboard, nativeImage } from 'electron';
// Bild aus Datei lesen und ins Clipboard
const image = nativeImage.createFromPath('/path/to/icon.png');
clipboard.writeImage(image);
// Bild aus Clipboard lesen
const fromClipboard = clipboard.readImage();
if (!fromClipboard.isEmpty()) {
await fs.writeFile('out.png', fromClipboard.toPNG());
}readImage() liefert immer ein nativeImage-Objekt — isEmpty() zeigt, ob ein Bild im Clipboard ist.
HTML und Rich-Text
// HTML schreiben (z. B. für Word, Apps mit Rich-Paste)
clipboard.writeHTML('<b>Wichtig:</b> Bitte beachten');
// HTML lesen
const html = clipboard.readHTML();Gut für „Copy as Rich Text" — der Empfänger entscheidet, ob er Plain-Text oder HTML einfügt. Word und Apple Mail nutzen beim Paste das Rich-Format.
Bookmarks (URL + Title)
// macOS: Bookmark = URL + Title
clipboard.writeBookmark('Beispiel-Seite', 'https://example.com');
// Lesen
const { title, url } = clipboard.readBookmark();Funktioniert auf macOS und Windows. Klassischer Use-Case: Browser kopiert ein Lesezeichen, deine App will es als Link mit Titel verarbeiten.
Mehrere Formate gleichzeitig — write
clipboard.write({
text: 'Plain-Text-Variante',
html: '<b>HTML-Variante</b>',
rtf: '{\\rtf1\\ansi RTF-Variante}',
bookmark: 'Beispiel'
});Damit ist „Copy" intelligent: der Empfänger entscheidet, welches Format er nimmt. Word nimmt RTF, Plain-Editor den Text, Browser ggf. das Bookmark.
Verfügbare Formate prüfen
const formats = clipboard.availableFormats();
// ['text/plain', 'text/html', 'image/png', ...]
if (formats.includes('image/png')) {
const img = clipboard.readImage();
// ...
}Sehr nützlich für Paste-Handler, die je nach Inhalt anders reagieren.
Aus dem Renderer (sandbox-konform)
ipcMain.handle('clipboard:write-text', (_event, text) => {
if (typeof text === 'string') clipboard.writeText(text);
});
ipcMain.handle('clipboard:read-text', () => clipboard.readText());contextBridge.exposeInMainWorld('api', {
copy: (text) => ipcRenderer.invoke('clipboard:write-text', text),
paste: () => ipcRenderer.invoke('clipboard:read-text')
});Im Renderer mit navigator.clipboard.writeText() (Web-API) ist auch eine Option — funktioniert in Electron seit Chromium-Update problemlos. Für bilder und HTML reicht's aber nicht überall, dann ist Main-API präziser.
FAQ
Web-API (navigator.clipboard) oder Main-Modul?
Web-API: simpel, async, gut für Plain-Text. Main-Modul: mehr Formate (Bookmark, mehrere parallel), sync. Bei reinem Text reicht Web. Bei Multi-Format oder Bildern: Main-Modul.
Funktioniert das im Sandbox-Modus?
Im Sandbox-Renderer ist clipboard nicht direkt zugänglich. Über IPC zum Main delegieren. Web-API (navigator.clipboard) funktioniert im Renderer auch im Sandbox.
Wie groß darf der Text im Clipboard sein?
Praktisch unbegrenzt — System-Clipboard ist auf Megabyte ausgelegt. Bei sehr großen Texten (10 MB+) wird's spürbar langsam. Bei „Tabellen-Daten kopieren" idR kein Problem.
Verliert das Clipboard seinen Inhalt beim App-Quit?
Nein — Clipboard ist System-global. Was du reinschreibst, bleibt nach App-Ende verfügbar. macOS-Eigenheit: bei Bildern wird der Bezugspfad manchmal mitkopiert, der nach Datei-Löschung tot ist.
Wie reagiere ich auf Clipboard-Änderungen?
Es gibt kein Built-in-Event. Polling ist der Workaround: alle paar 100 ms readText() und vergleichen. Nur sinnvoll bei aktiven Clipboard-Apps (Snippet-Manager etc.) — mit deaktivieren bei verlorenem Fokus.
Linux: zwei Clipboards (Selection + Clipboard).
Auf X11 gibt es das normale Clipboard und die „Primary Selection" (Mittelklick-Buffer). Mit clipboard.writeText('text', 'selection') ansprechen. Wayland hat das nicht mehr; auf macOS/Windows ignoriert.