🖋️2019-08-16 🔄2019-10-20
by shibanyan_1

Windows10 1903で標準のフォトがCPU使用率を上げる不具合の対処法

1903ではフォトを無限にkillし、Windowsフォトビューワーをリストアする必要があります。

日時 内容
2019/08/17
  • フォトの設定による改善について
  • 2019/10/20
  • 記事内容とは無関係の画像やフォーマットの調整と統一
  • TL;DR #

    寝ようとしたらCPUファンが波打つように唸って妨害されたので勢いで綴った。

    1スレッドのみ100%になったり収まったりを繰り返す様子 <- を再現しようとしたら全スレッド食い潰した


    タスクマネージャ上では"Runtime Broker"という表記だが、フォト(Microsoft.Photos)を強制終了すると収まることから、それによるものと判明。

    フォトのプロセスがある状態(バックグラウンドでも)で操作が無くディスプレイが消灯すると発生するように感じる。
    また、大量の画像があるディレクトリで起動するとなりやすいかもしれない。

    どちらにせよ不必要なスケーリングや処理速度等の面で使い勝手が悪い"フォト"を、古き良きWindowsフォトビューワに置き換える良い機会だ。

    フォトを無限にkillするPowerShellスクリプト #

    フォトの設定で登録されているフォルダを削除しても少しは良くなったようだが、これはkillしかなさそうだ。

    フォトの設定をしても... マシではあるが駄目ぽ...

    ただ無限ループでkillを叩くのが一番シンプルなんだけど、ここはWindowsのイベントを指くわえて待ってもらう方式でいく。

    # 190815
    
    # 手始めにMicrosoft.Photosをkill
    Stop-Process -Id (Get-Process "Microsoft.Photos").Id -ErrorAction SilentlyContinue
    Write-Output 'きいぃぃぃぃる!(初回)'
    
    # CIMイベント購読をバックグラウンドで実行 Microsoft.Photos.exeプロセス開始を取得する
    Register-CimIndicationEvent -Query "Select * from win32_ProcessStartTrace where processname = 'Microsoft.Photos.exe'" -SourceIdentifier PhotosStart
    
    # ここから無限ループで待機
    while ($True)
    {
        # イベント内容を取得
        $GetEvent = Get-Event -SourceIdentifier PhotosStart -ErrorAction SilentlyContinue
    
        # イベントが空でなければ以下を実行
        if ($Null -ne $GetEvent)
        {
            # Microsoft.Photosプロセスをkillして
            Stop-Process -Id (Get-Process "Microsoft.Photos").Id
            Write-Output "きいぃぃぃぃる!"
            # 取得されたイベントを削除して0件に戻す
            $GetEvent | Remove-Event
        } else
        {
            Write-Output "何も起きない"
        }
    
        # ちょっと待つ
        Start-Sleep -Seconds 10
    }
    
    1. 上記スクリプトを拡張子.ps1、日本語環境のWindows PowerShellの場合Shift-JISで保存。

    2. タスクスケジューラで新しいタスクの作成。

    3. 以下のように設定する。
      ・最上位の特権で実行する: 有効
      ・表示しない: 有効
      ・トリガー: "ログオン時"
      ・操作: プログラムの開始
      ・プログラム/スクリプト: powershell
      ・引数の追加: -Command Start-Process -Verb runAs -File powershell "ps1のフルパス" -WindowStyle Hidden ・タスクを停止するまでの時間: 無効

    ↑はcmd等からpowershellを、そこからpowershellスクリプトをRun as Administratorするのを元にしてる。
    動いているか心配な場合は、-WindowStyle Minimizedでコンソールウィンドウを表示させると良い。

    powershell -Command Start-Process -Verb runAs -File powershell "C:\DTV\bin\PhotosKill.ps1" -WindowStyle Hidden
    

    レジストリ操作不要でWindowsフォトビューワを復活させる #

    レジストリを直接弄らずにパパっとWindowsフォトビューワを復活させる。
    言わずもがな1903に対応している。

    powershell -Command "rundll32 '%ProgramFiles%\Windows Photo Viewer\PhotoViewer.dll', ImageView_Fullscreen %1"
    
    1. 上記スクリプトを拡張子.bat、日本語環境のcmd.exeの場合Shift-JISで保存。
      因みにこれに画像をD&Dしても動くよ。

    2. 画像ファイルを右クリック -> プログラムから開く -> 別のプログラムを選択 -> その他のアプリ -> このPCで別のアプリを探す から1.で保存したスクリプトを指定する。
      起動したら成功。

    3. もう一度プログラムから開く -> 常にこのアプリを使ってファイルを開く

    ftypeで指定しても良いな

    これで終わりです。