HyperDesk - Hyper-V/RDPセッションを1つのウィンドウに埋め込むデスクトップアプリ
(github.com/qetqet910)複数のVMを立ち上げてウィンドウを切り替えるのに疲れて作りました。
会社の業務に慣れていく中で、ふとこんなことを思いました。
保守対応が1件入ると、その顧客企業のサーバーへのリモートデスクトップ(MST)、
クライアントのバージョンに合わせた開発環境(Hyper-V)、特殊な環境を必要とする顧客企業(VDI/Omnissa)などなど、
画面があまりにも散らかってしまうけど……何か良い方法はないだろうか?
そこで、チームの助けに少しでもなればと思い、自分で作ってみました。
- 動作方式
HyperDeskはHyper-V(VMConnect)とRDPセッションをWin32 Window Swallowingでアプリ内に埋め込みます。
プレビューやタブではなく、実際のセッションウィンドウをSetParentで取り込む方式です。
- 単一アクティブビュー + 即時切り替え: アクティブなセッション1つをフルスクリーンで表示し、Alt+1〜4(またはヘッダータブ)で最大4つのセッションを即座に切り替えます。ほかのセッションはバックグラウンドでそのまま生きているので、切り替えても切断されません。
- キーボードルーティング: アクティブなセッションにフォーカスがある場合、WinキーやAlt+TabのようなシステムショートカットがVM内部へ渡されます。
- UIフリーズ防止: 外部クライアントの認証モーダルが表示されてもメインUIが止まらないよう、
AttachThreadInputの代わりに独立したメッセージキューを構成してデッドロックを回避しました。 - Window追跡: アプリウィンドウのリサイズなどでレイアウトが変わる際、埋め込まれた外部ウィンドウの位置を
requestAnimationFrame+ バックエンドのデルタフィルタリングで追従させました。
このほか、スナップショット、リモート資産ごとの別名/メモ、コマンドパレット、RDP、Hyper-V On/Offといった便利機能を入れています。
- スタック / 環境
Tauri v2 + Rust + React 19
Windows専用
ランディングページ : https://landinghyperdesk.netlify.app/ (Y2K)
- まだできていないこと
VMware/Omnissa Horizonはクライアント起動コードの一部はありますが、実運用での検証はできていません。特にOmnissaはVM自体ではなくダッシュボードの形なので、ウィンドウをつかまえるのが難しく、埋め込みは無効化された状態です。
サイドプロジェクトとして作ったものなので、至らない点が多いです。特にWindow Swallowing方式自体の限界や、このアプローチが実務で安定して使えるのかについて意見を聞きたいです。同じような悩みを持ったことがある方は、ぜひフィードバックをお願いします。積極的に取り入れます!
まだコメントはありません。