Skip to content
dhq-boilerPublic

About

Windowsのウィンドウ配置とYouTubeの再生状態を保存・復元するデスクトップアプリ

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

13 Commits

Folders and files

Repository files navigation

Kankei(還景)

Windows の作業環境を保存し、後から配置を復元するローカル常駐アプリです。

メイン画面右上の Language(バージョン情報の隣)から 日本語 / English を切り替えられます。 画面・配置プレビュー・バージョン情報・トレイメニューに即時反映し、選択中のプロファイルを保持します。 言語設定は %LOCALAPPDATA%\Kankei\language.json に保存され、次回起動にも引き継がれます。 翻訳は src/Kankei.Desktop/Localization/en.json にまとめています。プロファイル名や他アプリのウィンドウタイトル、外部由来のエラーは翻訳しません。

実装済みの最初の縦切り

メイン画面は中央に配置プレビュー、下部に配置選択と「+ 新規配置」を配置しています。 配置の選択だけでは復元しません。隣の「•••」でポップアップメニューを開き、復元・保存し直し・API連携・削除を選べます。 新規作成と保存し直しは、保存専用ダイアログでウィンドウをチェックして名前を付けます。保存完了後はメイン画面へ戻り、その配置を選択します。 API連携はURL/curlを表示・コピーする専用ダイアログ、削除は名前付きの確認ダイアログを開きます。

  • 実行中のトップレベルウィンドウを列挙し、%LOCALAPPDATA%\Kankei\layouts に JSON 保存
  • 保存済みアプリの起動/前面化と、位置・サイズ・表示状態の復元
  • アイテム別の復元状況を示す中央オーバーレイ
  • 127.0.0.1:48120 限定の REST API
  • stdio MCP アダプターによるアプリ内部状態の保存・復元(公式 C# SDK 2.2.0)

起動

インストーラーは GitHub Releases の KankeiApp-win-Setup.exe を使用します(Windows x64、.NET 同梱)。 ソースから起動する場合は .NET 10 SDK が必要です。

dotnet run --project src/Kankei.Desktop

通知領域の Kankei アイコンを右クリックし、「保存済みの配置を復元」からプロファイル名を選んで復元できます。 一覧は右クリックするたびに更新されます。「配置を選んで保存・復元…」の画面上部からも選択して復元できます。

プロファイル選択後の「API URLをコピー」は HTTP POST 用の復元URLを、「curlをコピー」は PowerShell でそのまま実行できる curl.exe --request POST コマンドをクリップボードへコピーします。実行時は Kankei を起動しておいてください。コピーするだけでは配置は変わりません。 「削除」は選択中のプロファイル名を確認してから保存データを削除します。削除は取り消せませんが、現在開いているウィンドウには影響しません。

画面右側には現在のモニター構成と配置プレビューを表示します。プロファイルを選ぶと復元予定の位置を重ね、「保存対象」へ切り替えるとチェックしたウィンドウの現在位置(一覧更新時点)を確認できます。 一覧の各ウィンドウにポインターを重ねると、その位置を強調します。最大化は復元先の作業領域、最小化は通常位置を破線で表示します。モニターが切断されている場合は、実際の復元と同じ移動先を表示します。

バージョン情報とアップデート

メイン画面の「バージョン情報」または通知領域の「バージョン情報・アップデート…」から開きます。 画面内のロゴには 512px PNG、実行ファイル・タイトルバー・通知領域には複数解像度入り ICO を使用します。

  • インストール版は起動10秒後と起動中30分ごとに、公開 GitHub Release の安定版を確認します。
  • 更新を見つけると通知領域に通知します。クリックするとバージョン情報を開きます。
  • 自動アップデートは既定で有効です。更新をダウンロード・検証して、アプリ終了時に適用します。作業中に勝手に再起動しません。
  • 「今すぐ更新して再起動」は最新の再生状態を保存してから更新し、Kankei を再起動します。配置の保存・復元中には適用しません。
  • 自動アップデートを無効にしても通知と手動確認を利用できます。設定は %LOCALAPPDATA%\Kankei\updates.json に保存します。
  • 開発版(dotnet run / VS デバッグ)は自動更新対象外です。チェックサム検証を含むダウンロード・適用には Velopack 1.2.0 を使用します。

インストーラーの作成・公開

./scripts/package.ps1 -Version 0.1.0

artifacts/releases/0.1.0 に Setup.exe、ポータブル ZIP、更新パッケージとフィードを作成します。 初期構成のインストーラーはコード署名なしです。本体は %LOCALAPPDATA%\KankeiApp、保存データは %LOCALAPPDATA%\Kankei に分離しています。

GitHub Actions は main の push / PR でテストし、vMAJOR.MINOR.PATCH タグの push でテスト・パッケージ作成・GitHub Release 公開を実行します。 タグがアプリとパッケージのバージョンになります。更新クライアントが参照する releases.win.json と .nupkg もインストーラーと同じ Release に配置します。 新しいバージョンを公開する場合は変更をコミットしてから、そのコミットに新しいタグを付けて push します。

一部のウィンドウだけ保存

起動時の選択画面、または通知領域の「配置を選んで保存・復元…」を開き、 対象にチェックして「選択した配置を保存」を押します。アイコンのダブルクリックでも開けます。 位置・サイズ・最小化/最大化の状態を保存します。Chrome の YouTube 再生状態も既定で保存します。 保存した名前のまま、通知領域の復元サブメニューまたは画面上部の一覧から復元できます。 一覧の更新は選択を解除します。保存時に対象が閉じていれば保存を中止します。 同名の保存済み配置は、確認後に選択したウィンドウだけの内容で置き換えます。

同じウィンドウが残っている間はハンドルとプロセス開始時刻を使い、再起動後はタイトルで識別します。 同名ウィンドウが複数ある場合やタイトルが変わって識別できない場合は、誤操作を避けるため復元を失敗にします。

保存にはモニターのデバイス名・画面領域・作業領域と通常表示時の位置も含まれます。 最大化・最小化の復元では、先に対象モニターへ移動してから表示状態を戻します。 同じデバイス名のモニターがあれば配置変更にも追従し、接続されていなければ利用可能な画面内へ収めます。 モニター情報のない旧データも保存座標から復元先を選びます。モニター名を記録するには配置を再保存してください。

Chrome は保存時に選択しているタブの HTTP(S) URL も記録します。復元時は同じURLのウィンドウを再利用し、見つからなければ --new-window で開きます。保存後に元のChromeが別ページへ移動していても、そのページは上書きしません。背景タブは保存時のタイトルを手がかりに選択し、URL一致を確認して再利用します(タイトルが変わった背景タブは見つからない場合があります)。TwitterとXのホスト名は同じページとして扱います。 既存プロファイルにURLを追加するには、対象のページを開いた状態で保存し直してください。Chromeの内部ページ・ローカルファイルはURL復元の対象外です。YouTubeの再生位置・一時停止状態は従来の専用処理を優先します。 座標取得・復元は PerMonitorV2 DPI awareness で実行します。異なる DPI 間でのアプリ固有の再レイアウトは未検証です。

YouTube の再生状態とレジューム

「Chrome の YouTube 再生リスト・再生位置・一時停止状態も保存」を有効にすると、選択した Chrome ウィンドウのアクティブな YouTube 動画タブを記録します。 動画 URL(動画 ID・再生リスト ID・index)、秒単位の再生位置、再生/一時停止状態が対象です。旧プロファイルで利用するには再保存してください。

  • 手動のプロファイル呼び出しでは、配置変更前に対象 Chrome の現在の再生状態を一時取得します。ウィンドウが残っていればページを再読み込みせず配置だけを戻し、再生を維持します。一時停止中の状態も維持します。
  • Chrome を起動し直す場合は、最新のレジューム記録、なければプロファイル保存時の状態を適用します。YouTube が再生リスト内の index を補正しても、動画 ID・再生リスト ID が同じなら受け入れます。
  • 対象ウィンドウの最新状態を 10 秒ごと、アプリの「終了」時、Windows のシャットダウン/サインアウト通知時に取得します。配置定義とは別に %LOCALAPPDATA%\Kankei\youtube-resume へ保存します。プロファイルを再保存すると旧レジューム記録を引き継ぎません。
  • シャットダウン時の最終取得は最大 4 秒待機します。Chrome が先に閉じた場合や強制終了・電源断では最終取得できないため、最後に成功した定期記録を使用します。Kankei が動作している必要があります。
  • 再起動時の位置指定は動画 URL の時刻パラメーターで行います。保存秒数との差が 3 秒以内になってから一度停止し、位置の安定と再生/一時停止状態を確認します。位置が合わない場合はタイムアウトし、矢印キーやコマ送りキーによる補正は行いません。ページの移動と再生ボタンの操作には前面化と入力操作を行います。
  • 通常の /watch 動画と日本語・英語のプレーヤー表示が対象です。非アクティブなタブ、ライブ配信、シャッフル/リピート設定、音量・速度は対象外です。広告・ログイン・Chrome や YouTube の仕様変更により取得・復元に失敗する場合は、復元エラーとして表示します。
  • Chrome に明示的な MCP アダプターが設定されている場合は、そちらを優先します。API 保存では includeYouTube:false を指定すると YouTube 状態を取得しません。

API

# 保存
Invoke-RestMethod http://127.0.0.1:48120/v1/layouts -Method Post -ContentType application/json -Body '{"name":"development"}'

# 一覧
Invoke-RestMethod http://127.0.0.1:48120/v1/layouts

# 復元開始
Invoke-RestMethod http://127.0.0.1:48120/v1/layouts/development/restore -Method Post -ContentType application/json -Body '{"showOverlay":true}'

MCP アダプター

%LOCALAPPDATA%\Kankei\adapters.json に次の形式で設定し、Kankei を再起動します。 設定ファイルがなくても、ウィンドウ配置と Chrome の YouTube 再生状態を保存・復元できます。 以下のパスとツール名は例です。連携するサーバーの実際の契約に合わせて指定してください。

[
  {
    "id": "editor",
    "executablePath": "C:\\Apps\\Editor.exe",
    "command": "C:\\Apps\\EditorMcpBridge.exe",
    "arguments": [],
    "exportTool": "export_workspace",
    "launchTool": "launch_or_focus",
    "importTool": "import_workspace",
    "stateArgument": "state",
    "timeoutSeconds": 30
  }
]
  • executablePath は絶対パスで指定します。ID と対象実行ファイルの重複は許可しません。
  • export と launch は引数なし、import は stateArgument に指定した引数名で JSON 値を受け取るツールが対象です。
  • export は structuredContent、またはテキスト内の有効な JSON を返す必要があります。null は保存失敗です。
  • 保存値は Kankei が { "version": 1, "state": ... } で包み、import には元の state を渡します。
  • アプリ単位の状態を扱います。同じアダプターの複数ウィンドウでは export/import を共有します。
  • 呼び出しごとに stdio サーバーを起動し、終了時に接続を破棄します。対象アプリとは別プロセスのブリッジを指定してください。呼び出し間でサーバーのメモリ状態は保持されません。
  • タイムアウトは 1~300 秒です。接続終了処理には追加で最大約 2 秒かかる場合があります。設定はローカル管理用で、レイアウトファイルからサーバーコマンドを実行することはありません。
  • export 失敗時はレイアウトを書き込みません。復元時の未登録 ID・不正な状態・ツールエラーはアイテムの失敗として表示します。

実アプリ向けのツール契約確認、HTTP 接続、ウィンドウごとの内部状態は未対応です。 複数モニター・DPI・同一アプリ内のウィンドウ識別の堅牢化は WBS の次項目です。

検証

dotnet test Kankei.sln

テスト用の stdio サーバーを別プロセスで起動し、SDK 経由の状態往復、エラー、タイムアウト、キャンセルを検証します。 MCP のテストはデスクトップのウィンドウを動かしません。 MonitorRestoreIntegrationTests は2画面環境で専用ウィンドウを作り、通常・最大化・最小化のモニター間復元を検証します。 2画面未満ではこの3件をスキップします。既存アプリのウィンドウは動かしません。

About

Windowsのウィンドウ配置とYouTubeの再生状態を保存・復元するデスクトップアプリ

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages