From e2e1822835e6d4a3b81396c00f55107071b642d0 Mon Sep 17 00:00:00 2001 From: Ciilu <109708109+Ciilu@users.noreply.github.com> Date: Thu, 5 Feb 2026 08:34:02 +0800 Subject: [PATCH 1/4] update --- .../jackhuang/hmcl/ui/GameCrashWindow.java | 12 +++++ .../util/platform/windows/WindowsEvents.java | 44 +++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 HMCLCore/src/main/java/org/jackhuang/hmcl/util/platform/windows/WindowsEvents.java diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/GameCrashWindow.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/GameCrashWindow.java index 6cc322ec94..8a9aae433b 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/GameCrashWindow.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/GameCrashWindow.java @@ -50,6 +50,7 @@ import org.jackhuang.hmcl.util.io.FileUtils; import org.jackhuang.hmcl.util.logging.Logger; import org.jackhuang.hmcl.util.platform.*; +import org.jackhuang.hmcl.util.platform.windows.WindowsEvents; import java.io.IOException; import java.lang.management.ManagementFactory; @@ -279,6 +280,17 @@ private void exportGameCrashInfo() { CompletableFuture.supplyAsync(() -> logs.stream().map(Log::getLog).collect(Collectors.joining("\n"))) .thenComposeAsync(logs -> { + var events = WindowsEvents.getApplicationEvents(); + var javaEvents = events.stream().filter((it) -> it.message().contains("java.exe") || it.message().contains("javaw.exe")).toList(); + if (!javaEvents.isEmpty()) { + LOG.info("Recently java event:"); + javaEvents.forEach(it -> { + LOG.info(String.format("ID: %d | Level: %s | Time: %s", + it.eventId(), it.level(), it.timeCreated())); + LOG.info("Message: " + it.message()); + }); + } + long processStartTime = managedProcess.getProcess().info() .startInstant() .map(Instant::toEpochMilli).orElseGet(() -> { diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/platform/windows/WindowsEvents.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/platform/windows/WindowsEvents.java new file mode 100644 index 0000000000..5b6a81aa4a --- /dev/null +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/platform/windows/WindowsEvents.java @@ -0,0 +1,44 @@ +package org.jackhuang.hmcl.util.platform.windows; + +import com.google.gson.reflect.TypeToken; +import org.jackhuang.hmcl.util.gson.JsonUtils; +import org.jackhuang.hmcl.util.platform.SystemUtils; + +import java.util.ArrayList; +import java.util.List; + +import static org.jackhuang.hmcl.util.logging.Logger.LOG; + +public final class WindowsEvents { + private WindowsEvents() { + throw new AssertionError(); + } + + private static final String psCommand = "Get-WinEvent -MaxEvents 50 -FilterHashtable @{LogName='Application'} | ForEach-Object { " + " [PSCustomObject]@{ " + " timeCreated = $_.TimeCreated.ToString('yyyy-MM-dd HH:mm:ss'); " + " level = $_.LevelDisplayName; " + " source = $_.ProviderName; " + " eventId = $_.Id; " + " message = $_.Message; " + " rawXml = $_.ToXml() " + " } " + "} | ConvertTo-Json -Compress"; + + + public record LogEntry(String timeCreated, String level, String source, int eventId, String message) { + } + + public static List getApplicationEvents() { + List results = new ArrayList<>(); + + try { + + String rawJson = SystemUtils.run("powershell.exe", "-NoProfile", "-Command", psCommand).trim(); + + if (!rawJson.isEmpty()) { + if (rawJson.startsWith("{")) { + results.add(JsonUtils.fromNonNullJson(rawJson, LogEntry.class)); + } else if (rawJson.startsWith("[")) { + results = JsonUtils.fromNonNullJson(rawJson, new TypeToken<>() { + }); + } + } + } catch (Exception e) { + LOG.warning("Failed to fetch detailed application logs", e); + } + return results; + } +} + From 0a054577e0a87e7b9d3987af28c03eb4f4a5c34c Mon Sep 17 00:00:00 2001 From: Ciilu <109708109+Ciilu@users.noreply.github.com> Date: Thu, 5 Feb 2026 08:51:04 +0800 Subject: [PATCH 2/4] update --- HMCL/src/main/java/org/jackhuang/hmcl/ui/GameCrashWindow.java | 2 +- .../org/jackhuang/hmcl/util/platform/windows/WindowsEvents.java | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/GameCrashWindow.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/GameCrashWindow.java index 8a9aae433b..ae4a1a2529 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/GameCrashWindow.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/GameCrashWindow.java @@ -281,7 +281,7 @@ private void exportGameCrashInfo() { logs.stream().map(Log::getLog).collect(Collectors.joining("\n"))) .thenComposeAsync(logs -> { var events = WindowsEvents.getApplicationEvents(); - var javaEvents = events.stream().filter((it) -> it.message().contains("java.exe") || it.message().contains("javaw.exe")).toList(); + var javaEvents = events.stream().filter((it) -> it != null && it.message() != null && (it.message().contains("java.exe") || it.message().contains("javaw.exe"))).toList(); if (!javaEvents.isEmpty()) { LOG.info("Recently java event:"); javaEvents.forEach(it -> { diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/platform/windows/WindowsEvents.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/platform/windows/WindowsEvents.java index 5b6a81aa4a..513a23091f 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/platform/windows/WindowsEvents.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/platform/windows/WindowsEvents.java @@ -24,7 +24,6 @@ public static List getApplicationEvents() { List results = new ArrayList<>(); try { - String rawJson = SystemUtils.run("powershell.exe", "-NoProfile", "-Command", psCommand).trim(); if (!rawJson.isEmpty()) { From 1fc389a6a30c9d2eb6e91f6d42d4ce7d77e41b65 Mon Sep 17 00:00:00 2001 From: Ciilu <109708109+Ciilu@users.noreply.github.com> Date: Thu, 5 Feb 2026 08:57:59 +0800 Subject: [PATCH 3/4] update --- .../jackhuang/hmcl/ui/GameCrashWindow.java | 28 +++++++++++-------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/GameCrashWindow.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/GameCrashWindow.java index ae4a1a2529..1b06aa3f5b 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/GameCrashWindow.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/GameCrashWindow.java @@ -60,6 +60,7 @@ import java.nio.file.attribute.FileTime; import java.time.Instant; import java.time.LocalDateTime; +import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.util.*; import java.util.concurrent.CompletableFuture; @@ -280,17 +281,6 @@ private void exportGameCrashInfo() { CompletableFuture.supplyAsync(() -> logs.stream().map(Log::getLog).collect(Collectors.joining("\n"))) .thenComposeAsync(logs -> { - var events = WindowsEvents.getApplicationEvents(); - var javaEvents = events.stream().filter((it) -> it != null && it.message() != null && (it.message().contains("java.exe") || it.message().contains("javaw.exe"))).toList(); - if (!javaEvents.isEmpty()) { - LOG.info("Recently java event:"); - javaEvents.forEach(it -> { - LOG.info(String.format("ID: %d | Level: %s | Time: %s", - it.eventId(), it.level(), it.timeCreated())); - LOG.info("Message: " + it.message()); - }); - } - long processStartTime = managedProcess.getProcess().info() .startInstant() .map(Instant::toEpochMilli).orElseGet(() -> { @@ -302,6 +292,22 @@ private void exportGameCrashInfo() { } }); + var events = WindowsEvents.getApplicationEvents(); + var javaEvents = events.stream().filter((it) -> it != null && it.message() != null && (it.message().contains("java.exe") || it.message().contains("javaw.exe"))).toList(); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + + if (!javaEvents.isEmpty()) { + javaEvents.forEach(it -> { + Instant compareInstant = LocalDateTime.parse(it.timeCreated(), formatter).atZone(ZoneId.systemDefault()).toInstant(); + if (compareInstant.toEpochMilli() > processStartTime) { + LOG.info("Found java event"); + LOG.info(String.format("ID: %d | Level: %s | Time: %s", + it.eventId(), it.level(), it.timeCreated())); + LOG.info("Message: " + it.message()); + } + }); + } + return LogExporter.exportLogs(logFile, repository, launchOptions.getVersionName(), logs, new CommandBuilder().addAll(managedProcess.getCommands()).toString(), path -> { From 9a7cff1155773c246b5522669dde36ca6d895fcd Mon Sep 17 00:00:00 2001 From: Ciilu <109708109+Ciilu@users.noreply.github.com> Date: Thu, 5 Feb 2026 08:59:11 +0800 Subject: [PATCH 4/4] update --- .../org/jackhuang/hmcl/util/platform/windows/WindowsEvents.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/platform/windows/WindowsEvents.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/platform/windows/WindowsEvents.java index 513a23091f..c197c3f66c 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/platform/windows/WindowsEvents.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/platform/windows/WindowsEvents.java @@ -35,7 +35,7 @@ public static List getApplicationEvents() { } } } catch (Exception e) { - LOG.warning("Failed to fetch detailed application logs", e); + LOG.warning("Failed to fetch application logs", e); } return results; }