Bar

PowerShell プロセスを常時監視し起動するスクリプト~HScroll.exe対策

ThinkPad トラックポイント・キーボードの現行版(USB・Bluetooth)を利用するとよくよく起きるHScroll.exeがクラッシュする問題。
クラッシュする度にHScroll.exeを手動で起動する事が嫌になってきたので、PowerShell を使ってプロセスを監視し自動起動するスクリプトを書いてみました。

2015.12.17 加筆
プロセスが起動していない状態に対応するためサンプルにtry...catch...finallyを追記しました。

HScroll.exeがクラッシュする問題

PowerShell ISEやVisual Studioの画面上でトラックポイントを使用し上下スクロールを行うとHScroll.exeがクラッシュします。
HScroll.exeは上下スクロールを制御する実行ファイルなため、クラッシュ後はその他アプリにおいても上下スクロールできなくなります。
現象の詳細くは、以前投稿した記事をお読みください。
ThinkPad Bluetooth キーボードで縦・横スクロールが出来なくなった場合の対処法

プロセス監視&自動起動

HScroll.exeがクラッシュしたら自動的に起動させたい。どうするか?と考えると、プロセスを常時監視すればいい。
スクリプト センターのサンプルを元にスクリプトを書いてみました。
作業は2つだけです。
  1. プロセスを監視し、プロセスが落ちたら自動実行するスクリプトを作成
  2. 対象PCが起動した時にスクリプトを実行するタスクを登録
1.プロセスを監視するスクリプトを書く
プロセスを常時監視し、落ちたら自動実行するスクリプトは下記のとおりです。
肝はWaitForExitメソッドです。
今回はこのスクリプトをc:\PowerShell フォルダにRestart-HScrollFun.ps1というファイル名で保存します。
#監視プロセス名
$procName = "HScrollFun"

#実行ファイル
$execPath = 'C:\Program Files (x86)\Lenovo\ThinkPad Compact Keyboard with TrackPoint driver\HScrollFun.exe'

#監視&自動起動
while($true){
    try{
        #プロセスを取得
        $p = Get-Process $procName -ErrorAction SilentlyContinue

        #始したプロセスが終了するまで待機するように指示
        $p.WaitForExit()
    }
    catch{
        Write-Host "No Process"
    }
    finally{
        #実行ファイルを起動
        Write-Host "Start Process"
        Invoke-Item $execPath
    }
}
2.タスク スケジューラに登録する
タスク スケジューラに1のスクリプト ファイルを自動実行するよう登録します。
  • トリガー
    スタートアップ時
  • プログラム/スクリプト
    powershell.exe
  • 引数の追加
    -WindowStyle Hidden -File c:\PowerShell\Restart-HScrollFun.ps1

テスト

最後にテストをして確認します。
  1. サインアウト→サインイン
  2. タスク マネージャとPowerShell ISEを起動
  3. PowerShell ISEのコンソール ペイン上でトラックポイントを使った上下スクロール
  4. タスク マネージャのHScroll プロセスのPIDが変化すれば成功
PIDの変化は、下記画像でいう「13072」の数字が変動する事を意味します。

本当は、こんな小手先な事をせずLenovoが対応版ThinkPad Keyboard Suiteをリリースすれば万事解決、世界人類皆ハッピーですよね。本当にトホホです(´・ω・`)

稀にタスクが強制終了します

使い続けてわかった事は、稀にタスク事態が強制終了します。
原因は分かりませんが、上下スクロールできなくなった場合はタスク スケジューラを確認、適時タスクを実行してください。

参考サイト