Windowsで勝手にフォーカスが外れる原因はWSLgだった|Docker Desktopとmsrdc.exeの切り分け記録

AIとWeb制作

Windowsでゲームやブラウザを使っている最中、操作していたウィンドウから突然フォーカスが外れるようになった。

ほんの一瞬のことだが、ゲームなら入力が途切れ、ブラウザなら文字入力が止まる。エラー画面が出るわけでもない。それでも繰り返されると、「また起きるかもしれない」という警戒が残り、集中そのものが削られていく。

今回、私の環境で原因を追ったところ、直接フォーカスを取得していたのはWSLgが起動した「msrdc.exe / RemoteApp」だった。そして、その経路を動かすきっかけになっていたのがDocker Desktopだった。

最初は、起動中のゲームやアプリを疑った

不具合が目立ったのはゲーム中だった。そこで最初は、同時に起動していた別のゲームや常駐アプリが前面へ出ているのではないかと考えた。

候補になりそうなアプリを一つずつ終了した。しかし現象は止まらず、ゲームをしていないブラウザの操作中にも発生した。

ここで「特定のゲームの不具合」という見方を捨てられた。困った現象が起きた場面と、本当の原因がある場所は、必ずしも同じではない。

PowerShellのログで、割り込んだプロセスを捕まえる

目で追うだけでは、どのウィンドウが割り込んだのか分からない。そこでPowerShellを使い、前面ウィンドウが切り替わった瞬間を記録した。

ログには、操作中のアプリの直後に次の情報が残っていた。

  • プロセス:msrdc.exe
  • ウィンドウ名:RemoteApp

さらに親プロセスとコマンドラインを調べると、親はwslhost.exeで、WSLDVC_PACKAGEwslg.rdpという文字列も確認できた。

WSLgは、LinuxのGUIアプリをWindows上で扱うための仕組みで、RDP技術を使ってLinux側の画面をWindowsへ統合している。見覚えのないRemoteAppは、外部から接続された画面ではなく、WSLのGUI統合に使われていたものだった。

Docker Desktopを止めると消え、起動すると再発した

ただし、WSLgが関係していると分かっただけでは十分ではない。なぜ、LinuxのGUIアプリを使っていないのに動いているのかが残る。

wsl --shutdownを実行しても、しばらくするとWSLとmsrdc.exeが再び起動した。そこでDocker Desktopを完全に終了し、条件を変えて確認した。

条件 結果
Docker Desktop停止 フォーカス喪失は発生しない
Docker Desktop起動 フォーカス喪失が再発
Docker Desktop再停止 再び発生しなくなる

Docker DesktopはWSL 2をバックエンドとして利用できる。私の環境では、Docker Desktopの起動をきっかけにWSLが動き、その中のWSLgがRemoteAppを起動し、msrdc.exeがフォーカスを奪う経路になっていた。

重要なのは、「Docker Desktopが直接フォーカスを奪った」と一段で決めつけないことだ。

Docker DesktopがWSLを起動する
→ WSLgがRemoteAppを起動する
→ msrdc.exeがフォーカスを取得する

原因をこの粒度まで分けたことで、Dockerを使うこと自体を諦めずに済む可能性が見えてきた。

LinuxのGUIを使わないなら、WSLgだけを無効化できる

Microsoftの公式情報では、ユーザーフォルダにある.wslconfigへ次の設定を加えることで、WSLのGUIアプリ対応を無効化できる。

[wsl2]
guiApplications=false

設定後は、作業中のWSLやコンテナを安全に終了したうえで、次を実行してWSLを再起動する。

wsl --shutdown

既存の.wslconfigがある場合は上書きせず、現在の設定へ追記・統合する。LinuxのGUIアプリを使っている場合は、その機能も使えなくなるため、誰にでも適する方法ではない。

私の場合も、これは恒久対策の候補であり、設定後にはDocker Desktopを起動した状態でmsrdc.exeが立ち上がらないか、フォーカス喪失が再発しないかを確認する必要がある。

「犯人らしいもの」より「条件で再現できること」を信じる

今回もっとも大きかったのは、最初の推測が外れたことではない。推測と観測を分けられたことだった。

ゲーム中に起きたからゲームを疑う。RemoteAppと表示されたから、リモート接続アプリを疑う。Dockerを止めたら直ったから、Dockerそのものが悪いと考える。どれも自然だが、その段階で結論にすると、本当の経路には届かない。

一つずつアプリを止める。前面ウィンドウを記録する。親プロセスをたどる。Dockerの停止・起動・再停止で再現する。この順番によって、「なんとなく怪しい」が「同じ条件なら同じ結果になる」へ変わった。

小さな不具合ほど、我慢して使い続けやすい。しかし、集中を何度も中断する問題は、発生時間の短さだけでは測れない。原因の見えない割り込みが消耗させるのは、数秒ではなく、その後の注意力だからだ。

だからこそ、違和感を気のせいにせず、ログに変える価値がある。記録できれば、見えなかった問題にも輪郭が生まれる。そして、機能を丸ごと捨てるのではなく、必要な部分だけを残す対策を考えられるようになる。

この記事を読んで、何か感じるものはありましたか?
読んで何か感じるものがあったら、そっと「いいね」を押してもらえると嬉しいです。

関連記事

目次