wsl-screenshot-cli
スクリーンショットを監視し、WSLで貼り付け可能にするWindowsクリップボード用CLIツール(例:Claude Code CLI、Codex CLIなど)、Windowsの貼り付け機能を維持します。
Windowsでスクリーンショットを撮り、WSLターミナルに貼り付けるとファイルパスが得られます。ペイントに貼り付けると画像が得られます。エクスプローラーに貼り付けるとファイルが得られます。すべて同時に。

クイックスタート
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 versionインストール
クイックインストール(推奨)
curl -fsSL https://nailu.dev/wscli/install.sh | bashこれは最新のバイナリを ~/.local/bin/ にダウンロードします。Go ツールチェーンは不要です。
Go経由でのインストール
go install github.com/nailuu/wsl-screenshot-cli@latestソースから
git clone https://github.com/Nailuu/wsl-screenshot-cli.git
cd wsl-screenshot-cli
go build -o wsl-screenshot-cli .自動起動オプション
オプション1 — シェル起動時に自動起動(~/.bashrc または ~/.zshrc に追加):
wsl-screenshot-cli start --daemon --quietヒント:--quietフラグは、新しいターミナルを開くたびに表示されるPolling process is already runningメッセージを抑制します。
注意: インストールスクリプトはバイナリを~/.local/bin/に配置します。これは通常~/.profile(ログインシェルのみ)で PATH に追加されます。.bashrcでcommand not foundが出る場合は、上記行の前に以下を追加してください:
> if [ -d "$HOME/.local/bin" ] && [[ ":$PATH:" != ":$HOME/.local/bin:" ]]; then
export PATH="$HOME/.local/bin:$PATH"
fi
``オプション2 — Claude Code フックで自動起動/停止(~/.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"
}
]
}
]
}
}
仕組み
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
bash永続的なpowershell.exe -STAサブプロセスが、シンプルな stdin/stdout テキストプロトコル(CHECK/UPDATE/EXIT)を通じてすべてのクリップボードアクセスを処理します。Go 側はCHECKコマンドを送信してポーリングします。PowerShell は事前コンパイル済みの .NET クリップボードAPI(System.Windows.Forms.Clipboard)を使用して変更検出を行います — ランタイムの C# コンパイルは不要で、EDR 製品(SentinelOne、CrowdStrike など)がcsc.exeをブロックしていても動作します。DoEvents()は Windows メッセージを処理して STA スレッドの応答性を維持し、クリップボード操作中の Explorer、Snipping Tool、その他アプリのフリーズを防ぎます。wslpath -w新しいスクリーンショットが検出されると、ポーラーは以下を行います:
- PowerShell から base64 PNG 形式で画像を受信
- SHA256 ハッシュで重複排除し、ディスクに保存
を使って WSL パスを Windows パスに変換CF_UNICODETEXTPowerShell に対して 3 つのクリップボード形式を同時に設定するよう指示 貼り付け時に何が起こるか
スクリーンショットがキャプチャされると、クリップボードには同時に 3 つの形式が含まれます:
| 貼り付け先 | クリップボード形式 | 得られるもの | |---|---|---| | WSL ターミナル(Ctrl+Shift+V) |
| ファイルパス:/tmp/.wsl-screenshot-cli/.png | | Windows 画像アプリ(Paint など) |CF_BITMAP| 画像としてのスクリーンショット | | Windows エクスプローラー / ファイルダイアログ |CF_HDROP| PNG ファイル(ファイルとして貼り付け) |使い方
起動
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| フラグ | 短縮 | デフォルト | 説明 | |---|---|---|---| |--daemon|-d|false| バックグラウンドデーモンとして実行 | |--interval|-i|250| ポーリング間隔(ms単位、100~5000) | |--output|-o|/tmp/.wsl-screenshot-cli/| PNGを保存するディレクトリ | |--quiet|-q|false| 情報メッセージを抑制 | |--verbose|-v|false| デバッグ用にすべてのPowerShell入出力をログ記録 |ステータス
停止
bash
wsl-screenshot-cli stop
更新
bash
wsl-screenshot-cli update
bash CGO_ENABLED=1 go test -race -count=1 -v ./...GitHubからの最新リリースへの更新。デーモンが実行中の場合、更新前に停止されます。すでに最新バージョンの場合、インストールスクリプトを再実行するとダウンロードがスキップされます。powershell.exe前提条件
- WSL2(Windowsの相互運用が有効)
- PowerShell がWSLからアクセス可能(
がPATHにあること)-raceGo 1.25+(ソースからビルドする場合のみ) テスト
要件
- Go 1.25+
- gcc —
フラグ(cgo依存)に必要。インストール方法:`
bash sudo apt update && sudo apt install -y gcc`テストの実行
レースデテクターを使用してフルスイートを実行します:
gccなしでも、競合検出なしでテストを実行できます:
bash
go test -count=1 -v ./...
プロジェクト構成
├── 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 ---