diff --git a/src/AxCopilot/Handlers/SystemInfoHandler.cs b/src/AxCopilot/Handlers/SystemInfoHandler.cs index a14fcdc..97d1a90 100644 --- a/src/AxCopilot/Handlers/SystemInfoHandler.cs +++ b/src/AxCopilot/Handlers/SystemInfoHandler.cs @@ -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 사용률 ────────────────────────────────────────────────