Surface Laptop 3 を使っていて、ちょっと放置しているだけで、
スクリーン セーバーが勝手にかかってしまう現象がおきています。
スクリーン セーバーの項目で設定を無効にしているのですが、
それでもなぜかスクリーン セーバーが起動してしまいます。
いいかげん鬱陶しいので、なんでこうなっているのかを解析して、
スクリーン セーバーが出てこないようにしようと思います。
> まずは現象を把握しよう
解析対象がはっきりしなければ何もできないので整理しましょう。
今の状況
スクリーン セーバーの設定は [なし] にしていて、設定も無効にしています。
それにも関わらず放置するとスクリーン セーバーが起動して画面がロックされてしまいます。
時間を計測したところ、60 秒でした。
Process Monitor を使って調査をしよう
動きをざっくり予想すると、何かが OS のレジストリの設定を参照して、
スクリーン セーバーを起動しているって感じですかね?
そうなるとレジストリのアクセス状況を確認したいので、
Process Monitor というツールを使って調査をしていくことにします。
プロセス モニターは、リアルタイムのファイル システム、レジストリWindowsプロセス/スレッドアクティビティを示す、アプリケーションの高度な監視ツールです。
と書いてありますがよくわかりません。
要はファイルやレジストリのアクセス状況を記録するツールです。
ツールの使い方については要望が多ければそれ専用の記事を作ってみようかと思いますが、
この記事では調査の内容について触れていくことにします。
> 調査
まず、今回の調査は以下の 3 つのボタンと右クリックだけで進めていきます。
ボタンの意味はそれぞれこんな感じです。
① ログの記録を開始・停止する
② 取ったログを削除する
③ フィルターをかける (超重要!)
1. ログを取ってみる
ツールを起動した時点でログの記録が開始されますので、① のボタンを押して記録を止めます。
そして ② のボタンを押してログを消します。
今回は 60 秒なにもしなければロック画面に遷移してしまいますので、
② をクリックしてログの取得を開始したら、画面がロックされるまで放置します。
画面がロックされたらパスワードを打ってログオンして、ログの記録を止めます。
2. それっぽい単語でフィルターをかけてアタリをつける
「スクリーン セーバーが出て画面がロックされるんでしょ?」 というざっくりな情報から、
"screen" とか "lock" とかで検索をかけてみます。
今回は "screen" とかついていそうなレジストリを参照しているかを見たいので、
以下のようなフィルターで絞り込みます。
その結果がこちらです。
なにやら winlogon.exe というプロセスが、"ScreenSaverIsSecure" とか "ScreenSaverActive" とか、
それっぽいレジストリを参照しています。
ですが 60 秒に関連する情報はなさそうです。
その他には LogonUI.exe というプロセスが "LockScreenHost" とか、それっぽいレジストリを
参照しています。
3. スクリーン セーバーを表示してるプロセスはいないか確認する
それっぽいレジストリを参照していることはわかりましたので、スクリーン セーバーを
表示させているプロセスが存在するかを確認してみます。
次はこんなフィルターをかけてみます。
これは "Process" という文言を含むオペレーションが行われたものだけを表示します。
"Process Create" とか "Process Exit" が出てくるので、プロセスが起動した or 終了した
という情報を絞り込むことができます。
絞り込んだ結果がこちらです。
今回はログの取得開始時刻が 22:51:45 です。
つまりおおよそ 1 分後に winlogon.exe というプロセスが scrnsaver.scr を呼び出しています。
scrnsaver ってきっと ScreenSaver のことでしょ。。。
4. アタリがついたプロセスに焦点を絞る
"2. " では winlogon.exe と LogonUI.exe の 2 つが候補でしたが、
"3. " の結果を踏まえると調査対象は winlogon.exe ですね。
winlogon.exe という文字を右クリックして [Include 'winlogon.exe'] をクリックすると、
このプロセス名で一発でフィルターをかけてくれます。
※ パスや時刻を右クリックしてしまうと、その項目でフィルターをかけることになります。
クリックする場所はしっかり確かめましょう。
今のフィルターの設定は、winlogon.exe が "Process" とつくオペレーションを実行したときの
情報を表示する、という内容です。
このままだとフィルターがキツすぎるので、以下のようにフィルターを弱めましょう。
winlogon.exe がパスの一部に "screen" と含まれるものにアクセスをしたときの情報を表示します。
これが最後のフィルターになります。フィルターの結果はこうでした。
ScreenSaveActive というレジストリを参照している様子が見えました。
Active かどうかを決めるもの?とりあえず怪しいレジストリですね。
5. 最後はネットで情報を探す
いきなりレジストリを触るのはさすがに怖いので、ネットでレジストリを検索してみましょう。
その結果、こんな公開情報が見つかりました。
公式から情報出てますね……
公開情報では HKU.DEFAULT 配下となっていますが、ここは HKCU に置き換えて問題ありません。
HKCU の CU は Current User を意味します。
HKU.DEFAULT は SYSTEM アカウントのレジストリです。
(よくデフォルト ユーザーのレジストリと間違われますが、SYSTEM のレジストリです。)
そのため、以下のレジストリを変更すれば今回の問題は解決すると判断しました。
HKCU\Control Panel\Desktop\ScreenSaveActive
実際のレジストリをみた画像が以下のものです。
ScreenSaveActive は 1、どれくらい放置されたらスクリーン セーバーに入るかを決める
ScreenDaveTimeOut は 60 なので、今回の現象と一致します。
ScreenSaveActive を 0 に変更して OS を再起動したらスクリーン セーバーに入らず、
画面がロックされる現象は起きなくなりましたとさ。
> まとめ : Process Monitor 便利
どこかの設定値おかしいのでは?とか何かを参照しているときの動きを見たい場合には
Process Monitor は非常に有効なツールです。
実はその他にもまだまだ使い方はあるのですが、それは私が問題に直面して調査したときに
またご紹介しようと思います。
何か調査してほしいネタとか募集してやってみるのも楽しそうだなぁ。