
▼ スリープ復帰時に起きるWi-Fi/オーディオアダプターのトラブル
Windows11に切り替えてかなりの時間が経過しました。Windows10の頃からスリープがかなり安全になってきて、自宅のデスクトップPCではWindows終了でなくスリープを多用することになりましたが、いつの頃からかスリープから復帰した時にオーディオアダプターが正常に動作しなくなったり、最近ではWi-Fiが繋がらない状態になったりと、不具合が出るようになりました。
今回は、この問題を解決できる方法をご紹介いたします。
▼ 起きている事象と現在の(面倒な)対応方法
①オーディオアダプター
私の環境では、サウンドは「TASCAM US-16×04」という外付けのオーディオアダプターを使っているのですが、スリープから戻ると必ず音が鳴らない状態になってしまいます。
この状態から回復するには、オーディオアダプターを接続しているUSBケーブルを一度抜く、あるいは一度オーディオアダプターの電源を切り、少ししてから再度電源オンにします。こうすることで、再度音が鳴るようになります。
②Wi-Fiアダプター
同様に、私のデスクトップ環境ではWi-Fiも外付けのWi-Fiアダプターを使っているのですが、ここ数か月でスリープ復帰後に、アクセスポイントは見えているのにネット接続が出来ないというトラブルが多発(50%程度、そして発生すると以後スリープ復帰時毎回)するようになりました。
こちらの回復は、さらにUX的に面倒です。順を追ってご説明します。
まずは、画面右下のWi-Fiアイコン(繋がっていない時は地球儀みたいなアイコン)をクリック、開かれた画面のWi-Fiアイコンの右にある「>」をクリックします。

するとアクセスポイントリストが表示されますので、左下の「その他のWi-Fi設定」をクリックします。

コントロールパネルの「ネットワークとインターネット > Wi-Fi」が開きますので、左下にある「ヘルプを表示」をクリックします。

ここまですると、ネットが繋がっていない状態であれば修復するためのトラブルシューティングが表示されます。そこにある「ネットアダプターをリセットする」を使うと、Wi-Fi接続が再開してくれます。
しかし、これって毎回やると結構面倒なんですよね・・・。そこで、何とか自動でできるようにできないかを考えてみました。
▼ 方針と個別のコード
この手順を自動的に実行できるようにすれば、スリープから復帰した後サウンドもWi-Fiも問題なく使えるようにできるはずです。
まず、各ハードを回復する方法です。これは理屈で言うと「スリープ復帰時に正常回復できなかったデバイスを一度オフにして再開させ、正常に認識できるようにする」ということを自動的に出来るバッチファイルが必要そうですね。
Wi-Fiから考えていきましょい。
①Wi-Fiアダプターの回復方法
こちらは簡単ですね。コマンドラインでインターフェイスの設定をオフ→オンにすることを考えましょう。
コマンドラインのインターフェイス操作には、標準コマンドの「netsh」を使用します。そして、インターフェイスは「netsh interface」で操作できます。
ネットワークアダプター名は標準では「Wi-Fi」なので、これを操作するコマンドラインを考えましょう。まずは一旦Wi-Fiアダプターをオフにする方法です。環境によっては「Wi-Fi 2」など変化している場合がありますので、その場合は環境に合わせて変更しましょう。
また、このコマンドはインターフェイス層にアクセスするため、管理者権限を付与したコマンドラインで実行する必要がありますのでご注意ください。

netsh interface set interface "Wi-Fi" disable
これを実行すると、ネットが未接続状態になるはずです。

そしたら次に、Wi-Fiをオンにしましょう。同様に管理者権限のコマンドラインを使います。
netsh interface set interface "Wi-Fi" enable
これでネットが再開し、Wi-Fiが正常に再接続されます。これらを合わせて、1つのBATファイルにしましょう。メモ帳を開いて、以下の内容をコピペしましょう。
echo off
echo Wi-Fiアダプターの修復
netsh interface set interface "Wi-Fi" disable
netsh interface set interface "Wi-Fi" enable
これを「WiFi-Recovery.bat」というファイルに保存しておきましょう。
②オーディオアダプターの回復
オーディオは少し面倒です。Wi-FiのようにOSの主機能であるインターネット関連は簡単にアクセスできるようになっていますが、オーディオアダプターはOSにとってはマルチメディアという別枠のものになるため、サービス層にアクセスする必要があります。これは「net」コマンドを使い、サービスの停止と開始を行う形となります。
この際、オーディオサービスだけでなく、オーディオを使った音声サービスも操作する必要がありますので、両方とも停止させた後、開始をするようにします。これも、①のWi-Fi同様にBATファイルにしておきましょう。
echo off
echo オーディオサービスの復旧
net stop audiosrv /y
net stop AudioEndpointBuilder /y
net start AudioEndpointBuilder
net start audiosrv
これでオーディオアダプター自体は問題なく再開できます。しかし、結構待ち時間が長いため、もっとスピードアップできる方法はないものでしょうか。
確認してみると、時間がかかるのは停止側で、再開は一瞬です。そこで、停止を高速化する方法を考えてみましょう。
要するにサウンド関連サービスが停止すれば良い訳ですから、タスクを強制Killすれば良いですね!以下のように修正してみました。
echo off
echo オーディオエンジンの高速修復
taskkill /f /fi "SERVICES eq audiosrv"
taskkill /f /fi "SERVICES eq AudioEndpointBuilder"
net start AudioEndpointBuilder >nul
net start audiosrv >nul
これで、処理は非常に高速化できるようになりました。やや危険と感じるかも知れませんが、既にオーディオアダプターの管理を失っている状態なので、問題は起きないと思われます。
▼ スリープ復帰後に自動回復するようにタスクスケジューラに登録
これで、個別に起動すれば回復できるバッチファイルが完成しました。スリープから復帰する度に問題が起きたアダプターに対応するバッチファイルを実行すれば大丈夫です。
しかし、毎回起きている場合は手動で実行するのも面倒になってきますよね。そこで、Windowsがスリープから復帰するイベント時に自動的にこのバッチファイルを実行するように設定してみましょう。
①タスクスケジューラを起動
[Winボタン] + [R] キーを押し、開いたコマンドボックスに「taskschd.msc」と入力して実行します。

タスクスケジューラが起動しますので、右の「操作」の中にある「タスクの生成」をクリックしましょう。すると、タスクの生成ダイアログが開きます。

まずは「全般」タブ内の「最上位の特権で実行する」をチェックしてください。

次に「トリガー」タブ下にある「新規」を押し、新しいトリガーを以下のように設定します。
タスクの開始:イベント時
ログ:システム
ソース:Power-Troubleshooter
イベントID:1

そして、操作タブに切り替え、「新規」を押して操作を登録しましょう。
操作:プログラムの開始
プログラム/スクリプト:参照で作成したバッチファイルを指定しましょう。

次に「条件」タブで、「コンピュータをAC電源で使用している場合のみタスクを開始する」のチェックボックスを外しておきましょう。こうしないと、バッテリー駆動しているノートパソコンのスリープ復帰時に回復バッチファイルが動かなくなってしまいます。

最後に「設定」タブ内の「タスクが失敗した場合の再起動の間隔」のチェックボックスをチェック状態にします。パラメータはそのままで大丈夫です。

最後に、Wi-Fiとオーディオアダプターの両方を自動修復する「まとめバッチファイル」を提示しておきます。私と同様の問題を抱えている方は、是非ご活用ください。
@echo off
setlocal
:: --- [1] Wi-Fiのリセット(タイミング重視で冒頭に配置) ---
echo Wi-Fiアダプターをリセット中...
set ADAPTER_NAME="Wi-Fi"
netsh interface set interface %ADAPTER_NAME% disable >nul 2>&1
netsh interface set interface %ADAPTER_NAME% enable >nul 2>&1
:: --- [2] オーディオエンジンの高速リセット ---
echo オーディオエンジンを高速リセット中...
taskkill /f /fi "SERVICES eq audiosrv" >nul 2>&1
taskkill /f /fi "SERVICES eq AudioEndpointBuilder" >nul 2>&1
net start AudioEndpointBuilder >nul
net start audiosrv >nul
echo 全ての復旧プロセスが完了しました。
timeout /t 2
それにしても、こんな面倒なことをしなくても自動的に回復する優しい世界が来れば一番良いのですよね。Microsoft様、モダンスリープの問題を解決してくれませんでしょうか・・・?