デジタル
  • ホームページ
  • ブログ
  • プライバシーポリシー
  • 私たちについて
  • Japanese
    • English
    • Japanese
  • 家
  • /
  • 記事
  • /
  • なんてったってIdle

なんてったってIdle


筆者は、一時、PCのモニターに液晶テレビを使っていたことがある。そのテレビはディスプレイモニターのような待機状態がなく、映像信号が10分間止まると自動で電源オフになる仕組みだった。この省電力機能を解除して常に電源が入ったままにすることもできるが、それでは電気が無駄である。自動でオフになったあとは、リモコン信号でオンにすることができるのだが、電源の制御はオンオフのトグル動作なので、電源オフのときに送ればオンになるが、オンのときに送ってしまうとテレビはオフになってしまう。つまり、PCの画面が消えたあと、テレビが自動オフになっていたときのみ、リモコン信号を送らねばならない。

方法としては2つ。1つは、ディスプレイの状態を調べて、オフかどうかを判定する方法。もう1つは、ユーザー入力がない時間(アイドル時間)を計って映像信号が止まるタイミングを見つけ、そこからの経過時間でテレビがオートオフになったことを推測する方法だ。前者は、かなり面倒な方法だったので、アイドル時間を測定する方法を使うことにした。

画面がオフになるまでの時間は、Windowsの設定アプリやコンロールパネルの電源オプションで調べることができる。頻繁に変更する可能性があるなら、プログラムで毎回調べる必要があるが、管理者権限が必要など結構面倒な処理だ。経験上、デスクトップマシンでは、ほとんど変更することはなかったので、固定値をプログラムにハードコードした。

アイドル時間を調べる

Windowsが測定しているアイドル時間を得るには、Win32APIの「GetLastInputInfo」を使う。APIの情報は以下にある。

・GetLastInputInfo function(英語)https://docs.microsoft.com/ja-jp/windows/win32/api/winuser/nf-winuser-getlastinputinfo

このAPIでは、最後にユーザー入力(キーボードやマウス操作)があった時刻を教えてくれる。ただし、その時刻表現は、俗に「Windows時間」と呼ばれる値が使われている。Windows時間はWindowsが再起動してからのミリ秒単位の経過時間を32bitの整数値で表現するもの。ただし、この値はシステムタイマーの割り込み時間間隔(10~16ミリ秒程度)で加算していくソフトウェア処理で作られる。このため、秒以上の時間単位では誤差はあまり目立たないがミリ秒単位で計測すると大きな誤差やばらつきがあるように見える点に注意されたい。

なんてったってIdle

今回は手抜きでWindows PowerShellを使った。一般的にはあまり人気のないWindows PowerShellだが、たいていのことはこれでこなせる。PowerShellには、C#のコードをコンパイルして呼び出す機能があるが、実行はインタプリタで行われる。この方法では、コンパイラもVisual Studioのような開発環境も不要だ。反面、C#で本格的なコードを書いてしまうとそのデバッグはかなり大変である。今回のプログラムは、Win32APIの呼び出し定義と構造体の初期化、構造体のメンバー取り出しだけなので、比較的簡単に作ることができた。

こうしたC#のコードを作るには、.NETのWin32呼び出しに関する情報をまとめたPINVOKE.NETを検索するといい。

・pinvoke.net: GetLastInputInfo (user32)https://pinvoke.net/default.aspx/user32/GetLastInputInfo.html・LASTINPUTINFO (Structures)https://pinvoke.net/default.aspx/Structures/LASTINPUTINFO.html

リスト01がアイドル時間を検出するプログラムだ。前半のヒアストリング(Here-String。@で囲まれた部分)がC#のコードで、Windows PowerShellは、実行時にこれをコンパイルして実行してくれる。後半がPowerShellで書いたC#コードを呼び出す関数定義と起動時のサンプル実行(最後の2行)だ。これをテキストファイルに入れて、拡張子を“.ps1”としておく。PowerShellを起動して、このファイルを読み込むと実例として途中経過表示付きで3秒のアイドル時間を測定する(写真01)。

定義したPowerShellの関数は2つ。1つはWaitIdle関数で、ミリ秒で指定したアイドル時間を検出する。“-Verbose”オプションを付けると途中経過を表示する。指定したアイドル時間を検出すると関数を抜け出してくるのでそこで何かを実行すればよい。アイドル時間が指定した時間以上にならない限り、この関数は終了しない。この関数に、PCが画面オフになる時間を指定することで画面オフのタイミングを検出できる。もう1つはIdleTime関数で、現在のアイドル時間をミリ秒(1秒=1000ミリ秒)で返す関数だ。なお、Windows PowerShellで文字列に日本語を使いたい場合には、ファイルをUnicodeエンコード(UTF-16LE)にする必要があるので注意されたい。

■ リスト01

$du=Add-Type -ErrorAction Ignore @'using System;using System.Diagnostics;using System.Runtime.InteropServices;namespace shioda.asb01 { public static class UserInput {[DllImport("user32.dll", SetLastError=false)]private static extern bool GetLastInputInfo(ref LASTINPUTINFO plii);[StructLayout(LayoutKind.Sequential)]private struct LASTINPUTINFO {public uint cbSize;public int dwTime;}public static int LastInputTime {get { LASTINPUTINFO myLastInputInfo = new LASTINPUTINFO(); myLastInputInfo.cbSize = (uint)Marshal.SizeOf(typeof(LASTINPUTINFO)); GetLastInputInfo(ref myLastInputInfo); return myLastInputInfo.dwTime;}} }}'@function global:IdleTime() { return [System.Environment]::TickCount - [shioda.asb01.UserInput]::LastInputTime;}function global:WaitIdle() { param ( [int32] $wt, [switch] $Verbose ) ; while (($t = IdleTime) -lt $wt ) {$w = $wt - $t;if($Verbose) {Write-Host ("Idle : {0,8:d} [ms] Wait : {1,8:d} [ms]" -f $t,$w ) }Start-Sleep -Milliseconds $w}}WaitIdle -verbose 3000; Write-host "You can excute anything here."

PowerShellは、.NET FrameworkやC#のクラスをそのままオブジェクトとして扱える。このプログラムではC#部分は“UserInput”というクラスになっていて、“LastInputTime”というプロパティが定義されている。

Win32APIを呼び出すような、ちょっとした実験にはWindows PowerShellは向いている。C#のコードがそのまま指定できるので、C#向けのWin32APIの情報をインターネット検索などで探すことで、参考にできるコードを見つけることができる。


02 / Mar / 2023 デジタル

ナビゲーションリスト

アイドル時間を調べる

カテゴリー

ブログ

関連記事

10.Apr.2023

義足製作からシューズ販売員へ 医療知識を駆使、足から延ばす健康寿命 京王百貨店小川直子

かつては人生60年時代と言われていたが、今では人生100年時代に突入している。街を見ていると元気なシニア層が増えた。だが、高齢になると足腰の強さが寿命にも直結してくるらしい。高齢者に限らず、少々歩きにくい...

09.Apr.2023

清原果耶主演『ファイトソング』に東啓介、藤原さくら、若林時英、窪塚愛流、莉子が出演

(左上から時計回りに)東啓介、藤原さくら、莉子、窪塚愛流、若林時英(c)TBS 2022年1月期のTBS火曜ドラマ『ファイトソング』に、東啓介、藤原さくら、若林時英、窪塚愛流、莉子が出演することが決定した。【写真】...

08.Apr.2023

在宅勤務(リモートワーク)を効率化するガジェット&アプリ総まとめ

見栄えが良ければ、尚よし。在宅で働くのが当たり前になって、新しいアイテムが必要だと感じる瞬間も増えたような気がしませんか? さまざまなガジェットを徹底比較してオススメを提案してくれることで大人気の米国...

07.Apr.2023

USB Type-Cケーブル1本でノートPCと簡単接続できる、 縦に広いWUXGA解像度の24.1型モニターを発売

EIZO株式会社(本社:石川県白山市、代表取締役社長:実盛 祥隆)は、24.1型WUXGA液晶モニター「FlexScan EV2485」を9月28日に発売します。価格はオープン価格※です。※オープン価格の製品は標準価格を定めていません。...

ホット記事

EVsmartブログ電気自動車や急速充電器を快適に 気になるトヨタの電気自動車『bZ4X』/バッテリー残量の%表示なし【編集部】 人気記事 最近の投稿 カテゴリー

EVsmartブログ電気自動車や急速充電器を快適に 気になるトヨタの電気自動車『bZ4X』/バッテリー残量の%表示なし【編集部】 人気記事 最近の投稿 カテゴリー

23.Apr.2022
レノボの8.8インチ片手タブ「Legion Y700」完全スペック公開!【価格は4万円台か】

レノボの8.8インチ片手タブ「Legion Y700」完全スペック公開!【価格は4万円台か】

01.May.2022
#初歩からのリモートデスクトップ ~外出先から自宅のパソコンへ接続(IPv4)編

#初歩からのリモートデスクトップ ~外出先から自宅のパソコンへ接続(IPv4)編

28.Apr.2022
MacとiPadを横に並べるだけで直接連携が可能になる「ユニバーサルコントロール」の仕組みとは?

MacとiPadを横に並べるだけで直接連携が可能になる「ユニバーサルコントロール」の仕組みとは?

30.Mar.2022

タグ

コンピューターモニターの測定方法

Copyright © 2023 homeappliancesbrands.com. All rights reserved.