From 1542d5124a930d9bd505a9795da43ce410ebbdb7 Mon Sep 17 00:00:00 2001 From: lacvet Date: Sat, 4 Apr 2026 18:41:46 +0900 Subject: [PATCH] =?UTF-8?q?[Fix]=20info=20uptime=20=EB=B6=80=ED=8C=85?= =?UTF-8?q?=C2=B7=EB=A1=9C=EA=B7=B8=EC=9D=B8=20=EC=8B=9C=EA=B0=84=20?= =?UTF-8?q?=EC=B8=A1=EC=A0=95=20=EC=95=8C=EA=B3=A0=EB=A6=AC=EC=A6=98=20?= =?UTF-8?q?=EC=A0=95=EA=B5=90=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 기존 문제: - 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 --- src/AxCopilot/Handlers/SystemInfoHandler.cs | 46 ++++++++++++++++++--- 1 file changed, 41 insertions(+), 5 deletions(-) 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 사용률 ────────────────────────────────────────────────