wsl-screenshot-cli
Outil CLI qui surveille le presse-papiers Windows pour les captures d’écran, les rendant collables dans WSL (par exemple Claude Code CLI, Codex CLI, ...) tout en préservant la fonctionnalité de collage Windows.
Prenez une capture d’écran sous Windows, puis collez-la dans votre terminal WSL — vous obtenez un chemin de fichier. Collez dans Paint — vous obtenez l’image. Collez dans l’Explorateur — vous obtenez le fichier. Tout cela en même temps.

Démarrage rapide
wsl-screenshot-cli start --daemon # start monitoring
wsl-screenshot-cli status # check it's running
wsl-screenshot-cli stop # stop monitoring
wsl-screenshot-cli update # update to latest versionInstallation
Installation rapide (recommandée)
curl -fsSL https://nailu.dev/wscli/install.sh | bashCela télécharge le dernier binaire dans ~/.local/bin/. Aucun outil Go requis.
Via Go
go install github.com/nailuu/wsl-screenshot-cli@latest
Depuis la source
git clone https://github.com/Nailuu/wsl-screenshot-cli.git
cd wsl-screenshot-cli
go build -o wsl-screenshot-cli .Options de démarrage automatique
Option 1 — Démarrage automatique avec votre shell (ajouter à ~/.bashrc ou ~/.zshrc) :
wsl-screenshot-cli start --daemon --quietAstuce : L’option--quietempêche le messagePolling process is already runningd’apparaître à chaque ouverture d’un nouveau terminal.
Remarque : Le script d’installation place le binaire dans~/.local/bin/, qui est généralement ajouté au PATH par~/.profile(seulement pour les shells de connexion). Si vous obtenezcommand not founddans.bashrc, ajoutez ceci avant la ligne ci-dessus :
> if [ -d "$HOME/.local/bin" ] && [[ ":$PATH:" != ":$HOME/.local/bin:" ]]; then
export PATH="$HOME/.local/bin:$PATH"
fi
``Option 2 — Démarrage/arrêt automatique avec les hooks Claude Code (à ajouter dans ~/.claude/settings.json) :
json
{
"hooks": {
"SessionStart": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "wsl-screenshot-cli start --daemon --quiet 2>/dev/null; echo 'wsl-screenshot-cli started'"
}
]
}
],
"SessionEnd": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "wsl-screenshot-cli stop 2>/dev/null"
}
]
}
]
}
}
Comment ça marche
mermaid
graph LR
subgraph WSL
CLI["wsl-screenshot-cli"]
Poller
GoClient["Clipboard Client"]
endsubgraph Windows PS["PowerShell · STA"] DotNet[".NET Clipboard API"] CB["Clipboard"] end
subgraph Output PNG["SHA256.png"] end
CLI -- "start / stop / status" --> Poller Poller -- "poll every 250ms" --> GoClient GoClient -- "stdin / stdout" --> PS PS -- "CHECK" --> DotNet DotNet -- "read image" --> CB Poller -- "save & dedup" --> PNG
bashUn sous-processus persistantpowershell.exe -STAgère tout l'accès au presse-papiers via un protocole texte simple stdin/stdout (CHECK/UPDATE/EXIT). Le côté Go interroge en envoyant des commandesCHECK; PowerShell utilise des API Clipboard .NET précompilées (System.Windows.Forms.Clipboard) pour la détection de changement — pas de compilation C# à l'exécution, donc cela fonctionne même lorsque les produits EDR (SentinelOne, CrowdStrike, etc.) bloquentcsc.exe.DoEvents()pompe les messages Windows pour garder le thread STA réactif — évitant les blocages dans Explorer, Snipping Tool, et d'autres applications pendant les opérations du presse-papiers.wslpath -wLorsqu'une nouvelle capture d'écran est détectée, le poller :
- Reçoit l'image en PNG base64 depuis PowerShell
- Déduplique par hash SHA256 et sauvegarde sur disque
- Convertit le chemin WSL en chemin Windows via
CF_UNICODETEXTDemande à PowerShell de définir trois formats de presse-papiers simultanément Ce qui se passe lors du collage
Après qu'une capture d'écran est prise, le presse-papiers contient trois formats simultanément :
| Où vous collez | Format du presse-papiers | Ce que vous obtenez | |---|---|---| | Terminal WSL (Ctrl+Shift+V) |
| Chemin de fichier :/tmp/.wsl-screenshot-cli/.png | | Application d'image Windows (Paint, etc.) |CF_BITMAP| La capture d'écran en image | | Explorateur Windows / boîte de dialogue de fichier |CF_HDROP| Le fichier PNG (coller-en-tant-que-fichier) |Utilisation
Démarrage
Foreground (useful for debugging)
wsl-screenshot-cli startBackground daemon (typical usage)
wsl-screenshot-cli start --daemonCustom interval and output directory
wsl-screenshot-cli start --daemon --interval 1000 --output ~/screenshots/Debug mode — logs all PowerShell I/O
wsl-screenshot-cli start --verbosebash $ wsl-screenshot-cli status Status: running PID: 12345 Uptime: 2h 15m 30s CPU usage: 2.5% Memory: 45.2 MB Screenshots: 127 Output dir: /tmp/.wsl-screenshot-cli/ Log file: /tmp/.wsl-screenshot-cli.log| Drapeau | Court | Par défaut | Description | |---|---|---|---| |--daemon|-d|false| Exécuter en tant que démon en arrière-plan | |--interval|-i|250| Intervalle de sondage en ms (100–5000) | |--output|-o|/tmp/.wsl-screenshot-cli/| Répertoire pour stocker les PNG | |--quiet|-q|false| Supprimer les messages d'information | |--verbose|-v|false| Enregistrer toutes les E/S PowerShell pour le débogage |Statut
Arrêt
bash
wsl-screenshot-cli stop
Mise à jour
bash
wsl-screenshot-cli update
bash CGO_ENABLED=1 go test -race -count=1 -v ./...Mises à jour de la dernière version depuis GitHub. Si le démon est en cours d'exécution, il sera arrêté avant la mise à jour. Relancer le script d'installation lorsque la dernière version est déjà installée sautera le téléchargement.powershell.exePrérequis
- WSL2 avec l'interopérabilité Windows activée
- PowerShell accessible depuis WSL (
doit être dans le PATH)-raceGo 1.25+ (uniquement si compilation depuis la source) Tests
Exigences
- Go 1.25+
- gcc — requis pour l'option
(dépendance cgo). Installer avec :`bash sudo apt update && sudo apt install -y gcc`Exécution des tests
Exécutez la suite complète avec le détecteur de course :
Sans gcc, vous pouvez toujours exécuter des tests sans détection de concurrence :
bash
go test -count=1 -v ./...
Structure du projet
├── main.go # Entry point
├── cmd/
│ ├── root.go # Root cobra command
│ ├── start.go # start command (flags, daemon/foreground)
│ ├── status.go # status command (process diagnostics)
│ ├── stop.go # stop command (SIGTERM)
│ └── update.go # update command (self-update via install script)
└── internal/
├── clipboard/
│ ├── clipboard.go # Go ↔ PowerShell client (stdin/stdout pipes)
│ └── clipboard.ps1 # Embedded PowerShell script (Win32 clipboard)
├── daemon/
│ ├── daemon.go # Daemonize, PID management, lifecycle
│ └── status.go # /proc parsing (CPU, memory, uptime)
├── platform/
│ └── platform.go # WSL environment checks
└── poller/
└── poller.go # Poll loop, SHA256 dedup, circuit breaker
``--- Tranlated By Open Ai Tx | Last indexed: 2026-06-14 ---