diff --git a/include/utils/string_ext.h b/include/utils/string_ext.h index 6f6df2e..62a8a45 100644 --- a/include/utils/string_ext.h +++ b/include/utils/string_ext.h @@ -30,4 +30,8 @@ char *stristr(const char *haystack, const char *needle); // 检查字符串列表中是否存在指定路径(不区分大小写) int string_list_contains(const StringList *list, const char *str); +// 展开环境变量(如 %JAVA_HOME%\bin → C:\Java\bin) +// 返回 malloc 分配的字符串,调用者负责释放;无变量返回 NULL +char *expand_env_vars(const char *path); + #endif // STRING_EXT_H diff --git a/src/ui/ui_utils.c b/src/ui/ui_utils.c index 8ec9dfc..91a13c9 100644 --- a/src/ui/ui_utils.c +++ b/src/ui/ui_utils.c @@ -1,7 +1,9 @@ #include "ui/ui_utils.h" #include "utils/os_env.h" +#include "utils/string_ext.h" #include #include +#include // 刷新列表样式(斑马纹 + 有效性检查) void refresh_single_list_style(Ihandle *list) @@ -61,7 +63,19 @@ void sync_string_list_to_ui(Ihandle *list_ui, const StringList *str_list) for (int i = 0; i < str_list->count; i++) { - IupSetAttributeId(list_ui, "", i + 1, string_list_get(str_list, i)); + const char *item = string_list_get(str_list, i); + IupSetAttributeId(list_ui, "", i + 1, item); + + // 对含环境变量的路径设置悬停提示 + if (item && strchr(item, '%')) + { + char *expanded = expand_env_vars(item); + if (expanded) + { + IupSetAttributeId(list_ui, "ITEMTIP", i + 1, expanded); + free(expanded); + } + } } IupSetInt(list_ui, "COUNT", str_list->count); diff --git a/src/utils/string_ext.c b/src/utils/string_ext.c index fd8a096..7065f5e 100644 --- a/src/utils/string_ext.c +++ b/src/utils/string_ext.c @@ -139,4 +139,27 @@ int string_list_contains(const StringList *list, const char *str) return 1; } return 0; +} + +// 展开环境变量(如 %JAVA_HOME%\bin → C:\Java\bin) +char *expand_env_vars(const char *path) +{ + if (!path || !strchr(path, '%')) + return NULL; + + DWORD size = ExpandEnvironmentStringsA(path, NULL, 0); + if (size == 0) + return NULL; + + char *expanded = (char *)malloc(size); + if (!expanded) + return NULL; + + if (ExpandEnvironmentStringsA(path, expanded, size) == 0) + { + free(expanded); + return NULL; + } + + return expanded; } \ No newline at end of file