[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 (volItem != null) items.Add(volItem);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ─── 가동 시간 ─────────────────────────────────────────────────
|
// ─── 가동 시간 / 부팅 시간 / 로그인 시간 ──────────────────────────
|
||||||
if (showUp)
|
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 uptimeStr = FormatUptime(uptime);
|
||||||
var bootTime = DateTime.Now - uptime;
|
|
||||||
items.Add(MakeItem(
|
items.Add(MakeItem(
|
||||||
$"가동 시간: {uptimeStr}",
|
$"가동 시간: {uptimeStr}",
|
||||||
$"마지막 재시작: {bootTime:MM/dd HH:mm}",
|
$"부팅: {bootTime.Value:MM/dd HH:mm:ss}",
|
||||||
uptimeStr,
|
$"부팅 {bootTime.Value:yyyy-MM-dd HH:mm:ss} 가동 {uptimeStr}",
|
||||||
Symbols.Clock));
|
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 사용률 ────────────────────────────────────────────────
|
// ─── CPU 사용률 ────────────────────────────────────────────────
|
||||||
|
|||||||
Reference in New Issue
Block a user