[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:
@@ -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 사용률 ────────────────────────────────────────────────
|
||||
|
||||
Reference in New Issue
Block a user