この記事について
この記事は、生成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
