[Fix] info uptime 부팅·로그인 시간 측정 알고리즘 정교화

기존 문제:
- Environment.TickCount64 사용 → 절전·최대절전 복귀 시 오차 발생
- 로그인 시간 미표시

개선 내용:
- 부팅 시간: System 프로세스(PID 4) StartTime 사용
  → Windows가 실제 부팅한 시각을 정확히 반영
  → PID 4 접근 불가 시 TickCount64로 폴백
- 로그인 시간: 현재 세션(SessionId 일치)의 explorer.exe 최초 StartTime
  → 멀티 세션 환경에서도 현재 사용자 세션만 선별
- 부팅→로그인 소요 시간(초) 추가 표시
- 시각 표시 HH:mm → HH:mm:ss 정밀도 향상

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-04 18:41:46 +09:00
parent afedd826c8
commit 1542d5124a

View File

@@ -173,17 +173,53 @@ public partial class SystemInfoHandler : IActionHandler
if (volItem != null) items.Add(volItem);
}
// ─── 가동 시간 ─────────────────────────────────────────────────
// ─── 가동 시간 / 부팅 시간 / 로그인 시간 ──────────────────────────
if (showUp)
{
var uptime = TimeSpan.FromMilliseconds(Environment.TickCount64);
// 부팅 시간: System 프로세스(PID 4) StartTime — TickCount64보다 정확
// (절전·최대 절전 후에도 실제 부팅 시각을 유지)
DateTime? bootTime = null;
try { bootTime = Process.GetProcessById(4).StartTime; }
catch { }
// 폴백: TickCount64 (PID 4 접근 불가 환경)
if (bootTime == null)
{
var ticks = TimeSpan.FromMilliseconds(Environment.TickCount64);
bootTime = DateTime.Now - ticks;
}
var uptime = DateTime.Now - bootTime.Value;
var uptimeStr = FormatUptime(uptime);
var bootTime = DateTime.Now - uptime;
items.Add(MakeItem(
$"가동 시간: {uptimeStr}",
$"마지막 재시작: {bootTime:MM/dd HH:mm}",
uptimeStr,
$"부팅: {bootTime.Value:MM/dd HH:mm:ss}",
$"부팅 {bootTime.Value:yyyy-MM-dd HH:mm:ss} 가동 {uptimeStr}",
Symbols.Clock));
// 로그인 시간: 현재 세션의 explorer.exe 최초 시작 시각
try
{
var sessionId = Process.GetCurrentProcess().SessionId;
var loginProc = Process.GetProcessesByName("explorer")
.Where(p => p.SessionId == sessionId)
.OrderBy(p => p.StartTime)
.FirstOrDefault();
if (loginProc != null)
{
var loginTime = loginProc.StartTime;
var loginElapsed = FormatUptime(DateTime.Now - loginTime);
var bootToLogin = loginTime - bootTime.Value;
items.Add(MakeItem(
$"로그인: {loginTime:HH:mm:ss} ({loginElapsed} 전)",
$"부팅→로그인 소요: {(int)bootToLogin.TotalSeconds}초",
$"로그인 {loginTime:yyyy-MM-dd HH:mm:ss}",
Symbols.Person));
}
}
catch { /* explorer 없는 환경 무시 */ }
}
// ─── CPU 사용률 ────────────────────────────────────────────────