ちょっとしたブラウジングをするなら、Windows 10 にアップグレードしたMiix 2 8で十分。ということで、今も便利に使っている。
購入してしばらくした頃からタッチパネルが反応しなくなる問題が発生し、Windows 8.1から10にアップグレードしてもこの問題は変わらず発生している。
問題が発生したらケーブルを抜き差しして問題を解消していた。
発生するまでに「あれ?突然タッチが効かなくなった?」というのが時々起こり、そのときは手のひら全体で画面をこする(埃を払う感じで)と復活したりして、だんだんそれでも復活しなくなり…という感じ。
最近はケーブル抜き差しでも復旧しないことがあり、キーボードでログインしてドライバを無効→有効にすることで復旧させたりしている。
だんだんと装置が劣化してきているのかな。
やること。
事前調査
ドライバの無効化→有効化で復旧するのであれば、それを行うプログラムを用意し、問題発生時に起動したい。
プログラムはこの考え方でできそう。
くろねこはうす / 所持者必見! MIIX2 8のタッチパネルが反応しない不具合を直す方法。
考えを整理しようと思ったとき、既に整理されているページがあって助かった。パネルの電源が入らないのか…
GooGle - / Lenovo MiiX 2 8 と WINDOWS10 について
スリープから復帰するときにタッチパネルを無効化→有効化させてみよう。
対策(Batch編)
動作はまぁまぁ速い。
ただし、WDKのインストールが必要になり、ディスクの容量を取られてしまう。
DevConのインストール
デバイスのオン/オフができるコマンドは、ハードウェア開発者向けに用意されたコマンドで行う。
Microsoft / Windows ハードウェア開発者 / Windows デバイス コンソール (Devcon.exe)
ここからたどっていって、Windows Driver Kit(WDT)をダウンロードする。
Microsoft / Windows ハードウェア開発者 / Windows Driver Kit (WDK) のダウンロード
インストールを済ませると、ココにコマンドがインストールされている。
C:\Program Files\Windows Kits\10\Tools\x86>
DevConの動作確認
管理者モードでコマンドプロンプトを開き、以下のコマンドを実行する。
>devcon help disable
Devcon Disable Command
Disables devices with the specified hardware or instance ID.
Valid only on the local computer. (To reboot when necesary, Include -r .)
devcon [-r] disable <id> [<id>...]
devcon [-r] disable =<class> [<id>...]
-r Reboots the system only when a restart or reboot is required.
<class> Specifies a device setup class.
Examples of >id<:
* - All devices
ISAPNP\PNP0501 - Hardware ID
*PNP* - Hardware ID with wildcards (* matches anything)
@ISAPNP\*\* - Instance ID with wildcards (@ prefixes instance ID) ← 今回はインスタンスIDを使うのでこの表記方法
'*PNP0501 - Hardware ID with apostrophe (' prefixes literal match - matches exactly as typed,
including the asterisk.)
>devcon disable "@ACPI\INV6050\1" "@ACPI\ATML1000\3&233A31A5&1"
ACPI\INV6050\1 : Disabled
ACPI\ATML1000\3&233A31A5&1 : Disabled
2 device(s) disabled.
※一般ユーザーで実行すると失敗する。
インスタンスIDはデバイスマネージャーで確認した。
バッチファイルの作成
こんなバッチファイルを組んでみる。
RestartTouchPanel.bat
"C:\Program Files\Windows Kits\10\Tools\x86\devcon" disable "@ACPI\INV6050\1" "@ACPI\ATML1000\3&233A31A5&1" "C:\Program Files\Windows Kits\10\Tools\x86\devcon" enable "@ACPI\INV6050\1" "@ACPI\ATML1000\3&233A31A5&1" echo %date% %time% >> %homepath%\desktop\RTP\rtp.log
※最後の行は起動していることを確認するためのログ出力。デスクトップにRTPというディレクトリを作っておき、そこにファイルを出力させることにした。
作成したバッチファイルをスリープ解除時に呼び出すようにする
今回作成したバッチファイルは、本来ならば「操作ができなくなったときい」だけ実行したい。
しかし、そのときにどんなイベントが発生するのか読み切れない…。
そとからイベントをキックできれば良いのだけれど、Windows 10 Homeでリモートデスクトップもできない。
ログインしようにも、タッチパネルが反応しないと何も入力ができないので本当に困ってしまう。
仕方がない、スリープ解除時に毎回実行してみようと考えた。
スリープ解除時にリスタートさせるとなると、使っているウチにかなりの回数が呼び出されることになる。
機器の寿命を縮める可能性があるので、適用するときには自己責任で。
イベントに関して、こちらに書かれている情報がとても勉強になった。
Web Scratch / [タスクスケジューラ]スリープから復帰時にプログラムの実行する方法
モニタを付けたり消したりしてどんなイベントが発生するのかを確認したところ、以下の通りとなった。
オン:システムログに Kernel-Power ID:507 システムがコネクト スタンバイ状態を終了します
オフ:システムログに Kernel-Power ID:506 システムがコネクト スタンバイ状態になります
これを利用する。
このような形で基本設定を行う。イベントには、先程調べた結果を設定した。
タスクの開始で「イベント時」を選択すると、設定グループの中身が変わり、イベントが設定できる。
試してみる
電源ボタンを押して画面を点けたり消したりして、ログが出力されることを確認する。
ログが出力されたら、バッチファイルは実行されているので、デバイスの無効化→有効化が行われたはずだ。
これはデバイスのプロパティの詳細で「最後に接続した日」を確認することができる。
スタートメニューに登録
コマンドをスタートメニューに登録し、キーボードでログインした時に簡単に実行できるようにする。
スタートメニューから「Windows システム ツール」→「コマンド プロンプト」とたどり、右クリックでポップアップメニューを表示させる。
「その他」→「ファイルの場所」をクリックする。
「コマンド プロンプト」のショートカットを適当な場所にコピーしてパラメータ設定を幾つか変える。
ここではデスクトップは以下に作ったRTPというフォルダを使うことにした。
ショートカットの名前は (Batch)RestartTouchPanel にした。
リンク先は %windir%\system32\cmd.exe /k %HOMEDRIVE%%HOMEPATH%\desktop\RestartTouchPanel.bat とした。
※赤文字部分が追加したところ。
このプログラムは管理者として実行する必要があるので、「詳細設定...」ボタンをクリックして、詳細プロパティを表示させ、「管理者として実行」にチェックを入れた。
このショートカットをスタートメニューにピン留めすればOK!
対策(PowerShell編)
動作は遅い。画面がついた都度起動するとなると、多分我慢できないと思う。
いつでもキーボードでログインできる環境の人ならこれでも良さそう。
ほぼ、ココにやりたいことの答えが書いてある。
ただし、Get-Device系のコマンドは全てGet-PnPDevice系のコマンドに置き換えている(32ビット版の為か、上手く動かない…)。
Igor Kulman / Enabling and disabling hardware devices with PowerShell
※スケジューラーへの登録は前項を参照のこと。
スクリプトの実行ポリシーを変更する
スクリプトの実行が許されていないため、スクリプトというだけでエラーになる。
スクリプトを実行できるようにする。
@IT / WindowsでPowerShellスクリプトの実行セキュリティポリシーを変更する
管理者権限でPowerShellを開き、実行ポリシーを変更する。
> Set-ExecutionPolicy RemoteSigned
実行ポリシーの変更
実行ポリシーは、信頼されていないスクリプトからの保護に役立ちます。実行ポリシーを変更すると、about_Execution_Policies
のヘルプ トピック (https://go.microsoft.com/fwlink/?LinkID=135170)
で説明されているセキュリティ上の危険にさらされる可能性があります。実行ポリシーを変更しますか?
[Y] はい(Y) [A] すべて続行(A) [N] いいえ(N) [L] すべて無視(L) [S] 中断(S) [?] ヘルプ (既定値は "N"): Y [Enter]
スクリプトの作成
そもそもPowerShellは起動に時間が掛かるようだし、さらにGet-PnPDeviceにも時間が掛かる。
そこで、参考にしたページに少し改変を加えてみた。
$deviceName = 'I2C HID*'
$allDevices = Get-PnPDevice
$allDevices | Where-Object -Property Name -Like "$deviceName" | Disable-PnPDevice -confirm:$false
$allDevices | Where-Object -Property Name -Like "$deviceName" | Enable-PnPDevice -confirm:$false
#$allDevices | Where-Object -Property Name -Like "$deviceName" | ForEach-Object -process {Write-Host $_.Name} ← デバッグ用の選択されたモジュール表示
これ、全部のデバイスを探して I2C HID から始まるデバイスを無効化→有効化する作りになっちゃった。
ダイレクトにIDとかを指定して値を取れば当然早くなると思うけど、PowerShell自体の起動がモッサリしているので、DevConが上手くいかない場合の保険くらいに考えることにした。
試してみる
PowerShellを管理者権限で開いてスクリプトを実行する。
※管理者権限でないと失敗する。
無効化→有効化が行われているかどうか、デバイスのプロパティで確認する。
スタートメニューに登録
コマンドをスタートメニューに登録し、キーボードでログインした時に簡単に実行できるようにする。
スタートメニューから「Windows PowerShell」→「Windows PowerShell」とたどり、右クリックでポップアップメニューを表示させる。
「その他」→「ファイルの場所」をクリックする。
「コマンド プロンプト」のショートカットを適当な場所にコピーしてパラメータ設定を幾つか変える。
ここではデスクトップは以下に作ったRTPというフォルダを使うことにした。
ショートカットの名前は (Power)RestartTouchPanel にした。
リンク先は %SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe %HOMEDRIVE%%HOMEPATH%\desktop\RTP\RestartTouchPanel.ps1 とした。
※赤文字部分が追加したところ。
作業フォルダは %HOMEDRIVE%%HOMEPATH%\RTP としている。
このプログラムは管理者として実行する必要があるので、「詳細設定...」ボタンをクリックして、詳細プロパティを表示させ、「管理者として実行」にチェックを入れた。
このショートカットをスタートメニューにピン留めすればOK!
さいごに
2つのやり方を試したけれど、結局、しょっちゅう起動すると考えたときに速度が重要と考えて、DevConを使った方式を採用。
タイミングによって引っかかるような感じがすることもあるけど、まぁ、大丈夫と言えそう。
どちらかというと、エラーが発生したときだけリセットすりゃ事足りるのに、スリープから復帰するたびにリセットを掛けることにしたのでハードウェアへの負担が気になるところ。
でも、参照先のページによれば割とこまめに電源が切れているみたいだから、割り切りとする。
コメントはこちらから お気軽にどうぞ ~ 投稿に関するご意見・感想・他