2011年3月29日火曜日

◆スリープ(Sleep)解除イベントを拾う

PCの世界でも節電が最重要課題だ。
スリープ機能を使えば節電出来るのは判っているが、経験上スリープを使うと様々な不具合に見舞われる。

メーカー製ノートPC等はハード的に対応が進んでいて問題は出づらいだろうがデスクトップPCになるとまだまだ?

特に追加機器を接続していたりすると顕著に地雷を踏む。

私もこのご時世なのでスリープ設定をしてみた。
Windows7はスリープに入るのも戻るのも非常に素早く快適だ。

っと思っていたのもつかの間、やはり不具合はやってきた。
ロジクールマウスにアサインしている機能が効かなくなる。(結構以前からある問題のようだ)
しかもどの機能が効かなくなるかはその時々で違う。

ん~、日本のために我慢して使うかとも思ったのだが、ここらへんは作業効率にシビアに効いてくる部分なのでかなりストレスが溜まる。

調べてみるとSetPoint(ロジクールのマウスウェア)を再起動してやれば直るらしい。

それなら、スリープ復帰のイベントを拾って再起動してあげればOKじゃん。

という訳でWMIでそれっぽい物を探す。
すると、まさにそれっぽいWin32_PowerManagementEventなんてのがある。

PS>Get-WmiObject -List *power*


   NameSpace: ROOT\cimv2

Name
----
Win32_PowerManagementEvent
CIM_PowerSupply
CIM_UninterruptiblePowerSupply
Win32_PerfFormattedData_PowerMet...
Win32_PerfRawData_PowerMeterCoun...

ネットでこいつを調べたところEventType=7がスリープ復帰(Resume)イベントらしい。
イベントの扱い方は以前PowerShell: ◆プロセスの開始終了を監視する(Register-WmiEvent、Get-Event)でやっているのでこいつを真似してスリープ復帰時にSetPointを再起動するスクリプトが以下である。

</TBOD
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029

#requires -version 2.0
#
# Sleep解除の監視
#


$query = "Select * From Win32_PowerManagementEvent where EventType=7"
Register-WmiEvent -query $query -sourceidentifier "Resume" 

try
{
   
While($true
){
       
$newEvent = Wait-Event
        $sp = Get-Process SetPoint
        $path = $sp.
path
       
$sp.
Kill()
           
       
Get-Event | Remove-Event
       
       
& $path
    }
}

catch
{
   
Write-Warning "以下のエラーが発生しました"
    $error[0]
}
finally
{
   
#イベントを削除し購読をやめる
    Get-Event | Remove-Event
    Get-EventSubscriber | Unregister-Event
}

あとはこれを、スタートアップなりスケジューラなりで実行して上げれば良い。
私は、キックする起動ファイルを作りたくなかったのでタスクスケジューラに登録した。
image

引数は以下のように指定してみた。
-WindowStyle Hidden -file "D:\PS\Sleep解除の監視.ps1"

 

その後確かめてみたらSetPoint自体は最新(Ver6.20)にバージョンアップしたら不具合は直っていた(^^;

0 件のコメント:

コメントを投稿