PowerShellからGetLastInputInfoを呼ぶ ― Windowsの最終入力からIdle時間を観察

PowerShellカテゴリを表すパンダのイラスト PowerShell

この記事について
この記事は、生成AIを活用した自動生成フローで作成しています。Microsoft Win32 APIのGetLastInputInfo仕様を確認し、PowerShellからP/Invokeして最終入力からの経過時間を観察する最小TRYに整理しています。

検証ステータス:📘 Microsoft公式仕様確認済み・Windows実機未確認

PowerShellからWin32 GetLastInputInfo を呼ぶと、キーボードやマウスの最終入力時刻を基に「どれくらい入力がないか」を観察できます。

今回、IdleSecondsが数値で取得できればTRY成功です。

Smoke Test

Add-Type @'
using System;
using System.Runtime.InteropServices;
public static class InputIdle {
  [StructLayout(LayoutKind.Sequential)]
  public struct LASTINPUTINFO { public uint cbSize; public uint dwTime; }
  [DllImport("user32.dll")]
  public static extern bool GetLastInputInfo(ref LASTINPUTINFO plii);
}
'@

$lii = New-Object InputIdle+LASTINPUTINFO
$lii.cbSize = [Runtime.InteropServices.Marshal]::SizeOf($lii)
if ([InputIdle]::GetLastInputInfo([ref]$lii)) {
  $now32 = [uint32]([Environment]::TickCount64 -band 0xFFFFFFFFL)
  $idleMs = [uint32]($now32 - $lii.dwTime)
  "[SUCCESS] IdleSeconds = {0:N1}" -f ($idleMs / 1000)
} else {
  $code = [Runtime.InteropServices.Marshal]::GetLastWin32Error()
  "[FAILED] GetLastInputInfo returned false. Win32Error=$code"
}

Observe

値を確認したら数秒マウスとキーボードに触れず再実行します。次にマウスを動かして再実行し、値が小さく戻るか見ます。

なぜ取れるのか

Windowsは入力イベントの時刻情報を保持しており、このAPIは現在セッションの最終入力情報を返します。これは勤怠や「本人が働いていた時間」の証明ではありません。

dwTime は32bitのtick値なので、再利用版では現在のtick値も32bit空間へ合わせて差を取る形にしています。APIから返る型とPowerShell側で計算する型を意識するのが、このTRYの一段深いポイントです。

1か所変えてみる

表示単位だけを秒から分へ変えます。

$idleMs / 60000

Daily-Code-Samples版では -Unit Seconds / -Unit Minutes として切り替えられるようにし、元のミリ秒、LastInputTick、CurrentTick32も確認できるようにしています。

失敗・境界

セッション、tick countの扱い、型変換を意識する必要があります。APIがfalseを返した場合は成功扱いにせず、Win32 errorも表示します。値を監視用途へ拡大解釈しないことも重要です。

仕事で使うなら

自分用のローカルツールで「一定時間入力がなければ重い自動処理を開始する」などの補助判定には使えます。たとえば大量CSVのローカル集計を開始する前の補助条件や、デモ端末の表示切替の実験です。

一方、従業員監視や勤怠判定へ安易に転用しないでください。入力がないことと仕事をしていないことは同義ではなく、このAPIは勤務実態を証明するものではありません。

公式情報

  • Microsoft Learn: GetLastInputInfo function

GitHubサンプル

文書情報

記事タイトル
PowerShellからGetLastInputInfoを呼ぶ ― Windowsの最終入力からIdle時間を観察
作成日
更新日
Source URL
https://papanda925.com/?p=16162

ライセンス: 本記事のうち、当サイトが権利を有する本文・自作図表は、特記なき限り CC BY 4.0 で利用できます。生成AIを活用して作成・編集した内容を含みます。コードについて、別途ライセンス表示またはリンク先GitHubリポジトリのライセンスがある場合は、その条件を優先します。引用・第三者資料・画像・商標等は本ライセンスの対象外です。 利用ポリシー

タイトルとURLをコピーしました