ITエンジニアのコツコツ日記

ITエンジニアの雑記です

BootCampのMacbookでスリーブ復帰時に高精度タッチパッドドライバが停止するのを防ぐ方法

bootcampのMacbookに高精度タッチパッドを導入する方法

こちらの記事でWindowsのMacにWindows10の高精度タッチパッドを導入する方法を紹介している。

MacBookのBootCampのWindowsに高精度タッチパッドドライバを導入

SPI系のタッチパッドを持つMacbookではスリープ復帰に失敗する

このオープンソースの高精度タッチパッドにはスリープ復帰に失敗する問題がある。

Github Trackpad doesn't work after sleep 203

Windowsのスリープからの復帰時に高精度タッチパッドのドライバが停止して、Windowsを強制終了するしかない問題があり、非常に問題だった。

この問題が解決しない限り、Windowsを完全にシャットダウンしないといけないため、スリープまたは休止モードの利用ができなかった。

※ 正確には運よく復帰に成功することもあるので、復帰に失敗したら強制終了という運用。。。

Trackpad doesn't work after sleep は未解決(2020/12/01時点)

この問題は2019年初頭から報告されているが、解決されていない。

原因はSPIドライバが最新のMacbookでは採用されておらず、古いMacbookにしかない。

このため、修正意欲も弱かったり問題の再現性が乏しいということだった。

しかし、私はMacbook12をWindows機として使い倒す気満々だ。

今のところMacBook12以上に優れた小型のWindowsは存在しないと自負している。 高解像度でUSB type-C(PD)で 軽量薄型でUS配列を条件にすると市販のPCで該当するものが無くなる。

ということで何とかこの問題を解決できないか検討した結果、回避できたので共有させていただく。

タッチパッドのスリープ復帰時停止を回避する方法

スリープ復帰時に正常に停止しなかったタッチパッドがエラーを返すのが原因なので、 スリープに入る前に強制的にハードウェアを停止させる。

そしてスリープ復帰時に手動でハードウェアを復帰させることで回避する。

PowerShell で タッチパッドをOnOffするためにIDを取得

f:id:itkotsukotsu:20201201005646p:plain

デバイスマネージャーで表示できるApple SPI Precision TouchPad DeviceがOnOffする対象だ。

以下のコマンドを管理者権限のPowerShell ISE で実行する。

Get-PnpDevice -FriendlyName "Apple SPI Precision Touchpad Device" | ft -wrap -AutoSize instanceid

以下のような結果が得られればOKで、SPIから始まるIDを控える。

f:id:itkotsukotsu:20201201005932p:plain

OnOffするスクリプトを作成

PowerShellのスクリプトを作成する。

各スクリプトの一行目にあるif はPowerShellを管理者権限で実行しなおす処理だ。

二行目がタッチパッドをOnOffするコマンド。

touchpad_On.ps1

if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) { Start-Process powershell.exe "-NoProfile -ExecutionPolicy Bypass -File `"$PSCommandPath`"" -Verb RunAs; exit }
Enable-PnpDevice -InstanceId "SPI\VID_05AC&PID_0275&MI_02\5&33D07321&0&02" -Confirm:$false

touchpad_Off.ps1

if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) { Start-Process powershell.exe "-NoProfile -ExecutionPolicy Bypass -File `"$PSCommandPath`"" -Verb RunAs; exit }
Disable-PnpDevice -InstanceId "SPI\VID_05AC&PID_0275&MI_02\5&33D07321&0&02" -Confirm:$false

これらのスクリプトを手動で実行し、タッチパッドが無効化、有効化できるかを確認しておく。

スクリプトをWindowsのタスクスケジューラに登録する

最後にWindowsがスリープに入出するときにこれらのスクリプトが実行されるようにする。

タスク作成方法

  1. タスクスケジューラを起動
  2. 操作からタスクの作成
  3. タスクの作成
    1. 全般最上位の特権で実行するにチェック
    2. トリガー新規からタスクの開始で以下を選択
      • タッチパッドOffスクリプト ⇒ ワークステーション ロック時
      • タッチパッドOnスクリプト ⇒ ワークステーション アンロック時
    3. 操作新規から作成したスクリプトを起動プログラムに指定
  4. 完了

f:id:itkotsukotsu:20201201011239p:plain

実際に試してみる

スリープや休止モードを試してみて、問題なくタッチパッドが回復すれば良い。

私の環境ではこれで完全にタッチパッドが停止する問題を回避できた。