无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
楼主: slore
打印 上一主题 下一主题

[原创] [更新(2022/11/11) ModernUI回归] explorer再见,WinXShell你好!

    [复制链接]
1111#
发表于 2025-4-19 14:19:45 | 只看该作者
回复

使用道具 举报

1112#
发表于 2025-4-24 16:04:46 | 只看该作者
看起来和explorer差别不大
回复

使用道具 举报

1113#
发表于 2025-5-8 12:25:18 | 只看该作者
感谢分享
回复

使用道具 举报

1114#
发表于 2025-5-8 15:14:49 | 只看该作者
WinXShell_RC5.1.4_beta9a版显卡名称和显存大小好像不能正确显示?有没有能正常显示的新版?

点评

GPU信息是从 Services\BasicDisplay\Video 下读取 VID,然后到 CurrentControlSet\Control\Video 下面获取显存。 没装显卡驱动的话,无法获取,我测试 beta9a 可以获取 系统基本显示器,还有正式系统的RTX显卡信息  详情 回复 发表于 2025-5-10 01:46
回复

使用道具 举报

1115#
 楼主| 发表于 2025-5-10 01:46:11 | 只看该作者
hua_wuxin 发表于 2025-5-8 15:14
WinXShell_RC5.1.4_beta9a版显卡名称和显存大小好像不能正确显示?有没有能正常显示的新版?

GPU信息是从 Services\BasicDisplay\Video 下读取 VID,然后到 CurrentControlSet\Control\Video 下面获取显存。
没装显卡驱动的话,无法获取,我测试 beta9a 可以获取 系统基本显示器,还有正式系统的RTX显卡信息。




function gpu_info()
  local arr = {}
  local vid = Reg:Read([[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\BasicDisplay\Video]],
    'VideoID')
  local gpu = nil
  if vid then
    gpu = Reg:Read([[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Video\]] .. vid ..[[\0000]],
      {'DriverDesc', 'HardwareInformation.qwMemorySize'})
  end

  if gpu == nil then
    arr['name'] = '-'
    arr['memsize'] = 0
  else
    arr['name'] = gpu['DriverDesc'] or '-'
    arr['memsize'] = gpu['HardwareInformation.qwMemorySize'] or 0
  end

  if arr['memsize'] > 0 then
    arr['memsize_gb'] = math.ceil(arr['memsize'] / 1024 / 1024 / 1024)
  else
    arr['memsize_gb'] = '-'
  end

  arr['memsize_info'] =  arr['memsize_gb'] .. ' GB'
  return arr
end

function localename()
  return App:Call('os::info', 'localename')
end
回复

使用道具 举报

1116#
发表于 2025-5-10 18:37:51 | 只看该作者
本帖最后由 hua_wuxin 于 2025-5-10 22:37 编辑

搞定了。发现同文件里有段local stdout = Cmd.Stdout('cmd.exe /c ipconfig.exe /all'),依葫芦画瓢reg query ... /v HardwareInformation.MemorySize再解析结果就行。




Intel集显的HardwareInformation.MemorySize是个REG_BINARY值,regkey:get_value()和Reg:Read()好像都不能正确读取成字符串或者数值。求解决方案。

tonumber('7ffff000', 16) = 2147479552 (2GB)



点评

我的 NVIDIA GeForce RTX 4060 Ti 显卡的内存值是 REG_DWORD 和 REG_QWORD保存的, HardwareInformation.MemorySize 是 4G, HardwareInformation.hwMemorySize 是 8 GB, 所以我用了 hwMemorySize 。 根  详情 回复 发表于 2025-5-10 23:45
回复

使用道具 举报

1117#
发表于 2025-5-10 23:09:02 | 只看该作者
本帖最后由 hua_wuxin 于 2025-5-11 02:42 编辑
absman1972 发表于 2025-5-10 15:34
slore 大:

我测试了一下从 Services\BasicDisplay 取 VideoID,不适用于所有情况

05-11更正:我原来的代码虽然能工作但其实是有问题的,跟absman1972坛友的代码以及楼主大佬1122楼的代码一组合就不知道哪里出错了,导致界面初始化异常。






我把isBinary()和binaryToNumber(binaryStr)加进我改过的代码中试了,先判断再转换或者不判断直接转换都不行。我觉得问题应该出在前面读注册表读出不知道是什么奇怪的东西(不是字符串、不是数字)。

你如果没有Intel集显环境的话,可以乱建(比如把Video\{82687041-2D88-11F0-8475-EA3147419290}删掉?)个注册表项测试下。

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Video\{82687041-2D88-11F0-8475-EA3147419290}\0000]
"DriverDesc"="Intel(R) Iris(R) Xe Graphics"
"HardwareInformation.MemorySize"=hex:00,f0,ff,7f

reg query方案的显示效果:

点评

空间确实是小(而且字体好像还无法再小?),为了能显示多个我把显存大小标签隐藏掉了。  发表于 2025-5-11 00:56
空间有限,多显卡的话,只显示第一个或者最后一个好些。详细的话,点【设备管理器】查看。不知道Win11正常系统怎么显示多显卡信息。  发表于 2025-5-11 00:09
回复

使用道具 举报

1118#
发表于 2025-5-10 23:20:51 | 只看该作者

谢谢分享
回复

使用道具 举报

1119#
 楼主| 发表于 2025-5-10 23:45:43 | 只看该作者
hua_wuxin 发表于 2025-5-10 18:37
搞定了。发现同文件里有段local stdout = Cmd.Stdout('cmd.exe /c ipconfig.exe /all'),依葫芦画瓢reg que ...
Intel集显的HardwareInformation.MemorySize是个REG_BINARY值,regkey:get_value()和Reg:Read()好像都不能正确读取成字符串或者数值。求解决方案。


我的 NVIDIA GeForce RTX 4060 Ti 显卡的内存值是 REG_DWORD 和 REG_QWORD保存的,
HardwareInformation.MemorySize 是 4G, HardwareInformation.hwMemorySize 是 8 GB,
所以我用了 hwMemorySize 。

根据2位的反馈,这里需要不少逻辑来处理。

首先, Reg:Read()会返回2个结果,一个是值,一个是类型。
对于REG_BINARY,winapi库的buff是2048,所以2K以内可以读取到,
超过2K的话,value直接是 nil 出错了。

对于4字节,8字节的数值型的话,可以直接读取到的,返回类型是string。
可以通过 string.unpack() 按4字节,8字节数值解出来字节流。


回复

使用道具 举报

1120#
 楼主| 发表于 2025-5-10 23:56:59 | 只看该作者
本帖最后由 slore 于 2025-5-11 00:03 编辑
absman1972 发表于 2025-5-10 15:34
slore 大:

我测试了一下从 Services\BasicDisplay 取 VideoID,不适用于所有情况



local function get_value_by_type(val, type)
    if type == REG_BINARY then
        return string.unpack("I" .. #val, val)
    end
    -- REG_DWORD, REG_QWORD
    return val
end


local mem_val = nil
local mem_type = nil
local mem_size = 0
mem_val, mem_type = Reg:Read([[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Video\{1722DE72-EC5D-11EF-8E37-806E6F6E6963}\0000]], 'HardwareInformation.qwMemorySize')
if mem_val then
    mem_size = get_value_by_type(mem_val, mem_type)
end


Alert(mem_size)

我发现办公电脑的集成显卡,显存是 128 MB, 单位转换函数也得改下,除以1024小于1的话,
保持本身单位,不能无脑按GB显示, 0.128 GB 很尴尬。

点评

感谢举例,已经用上了,省了我reg query和一小段丑陋的代码  发表于 2025-5-11 02:35
回复

使用道具 举报

1121#
发表于 2025-5-11 00:41:22 | 只看该作者
感谢分享
回复

使用道具 举报

1122#
发表于 2025-5-11 02:33:15 | 只看该作者
absman1972 发表于 2025-5-11 00:02
我汇入你提供的资料(如下),然后强制 vid 为 {82687041-2D88-11F0-8475-EA3147419290} 后读取也没有任何 ...

我的local memorysize = subkey:get_value('HardwareInformation.qwMemorySize') or subkey:get_value('HardwareInformation.MemorySize') or 0好像有问题,改成local memorysize, datatype = ...后用string.unpack不正常。改掉后才好了。
回复

使用道具 举报

1123#
发表于 2025-5-11 08:17:42 | 只看该作者
我想把CPU信息中的(R)和(TM)替换为®和™缩短下长度,但得到了乱码。我看了下page.systeminfo.lua已经是UTF8编码的。
请教下有没有简单的解决方法?

  1. local s = cpu_t['name']
  2.         local i = string.find(s, '@')
  3.         if i then s = string.sub(s, 1, i - 1) end
  4.         s = string.gsub(s, '%(R%)', '®')
  5.         s = string.gsub(s, '%(TM%)', '™')
  6.         set_text('card_cpuname_text', s)
复制代码






点评

那就保留1位小数,然后替换.0空格 为 空格。  详情 回复 发表于 2025-5-11 19:37
Windows不支持utf8,要转unicode,lua文件的utf8按ansi对待的。 考虑这行xml的font改用小字体。  详情 回复 发表于 2025-5-11 09:31
回复

使用道具 举报

1124#
 楼主| 发表于 2025-5-11 09:31:07 | 只看该作者
hua_wuxin 发表于 2025-5-11 08:17
我想把CPU信息中的(R)和(TM)替换为®和™缩短下长度,但得到了乱码。我看了下page.systeminfo.lua ...

Windows不支持utf8,要转unicode,lua文件的utf8按ansi对待的。
考虑这行xml的font改用小字体。
回复

使用道具 举报

1125#
发表于 2025-5-11 10:23:00 | 只看该作者
看起来很牛逼。谢谢分享。
回复

使用道具 举报

1126#
发表于 2025-5-11 11:51:07 | 只看该作者
谢谢分享
回复

使用道具 举报

1127#
 楼主| 发表于 2025-5-11 13:35:43 | 只看该作者
补一个大小转单位的辅助函数。
下午更新一下。

Format = {}
Fmt = Format


function Format.SizeUnit(size, fmt)
    local units = {"Bytes", "KB", "MB", "GB", "TB"}
    local n = 1
    local quot = size
    while (quot >= 1024) do
        n = n + 1
        quot = quot / 1024
        if n == #units then break end
    end
    return string.format(fmt, quot) .. units[n], quot, units[n]
end


-- test
print(Format.SizeUnit(0, "%.0f ")) -- 0 Bytes
print(Format.SizeUnit(123, "%.0f ")) -- 123 Bytes
print(Format.SizeUnit(1024, "%.0f ")) -- 1 KB
print(Format.SizeUnit(20250505, "%.0f ")) -- 19 MB
print(Format.SizeUnit(20250505, "%.2f ")) -- 19.31 MB
print(Fmt.SizeUnit(0x1ffc00000, "%.0f ")) -- 8 GB
print(Fmt.SizeUnit(1500000000000, "%.2f ")) -- 1.36 TB
print(Fmt.SizeUnit(1500000000000000, "%.0f ")) -- 1364 TB

点评

while (quot >= 1024)建议改成while (quot > 999),循环里仍然除以1024不变。 之前举例的Intel集显显存,取一半是1073739904,用这段代码算出来是: 1024.00MB 1023.9981689453 MB 没能凑整到1GB上。 改后则  详情 回复 发表于 2025-5-11 20:27
回复

使用道具 举报

1128#
发表于 2025-5-11 15:04:08 | 只看该作者
用心了
回复

使用道具 举报

1129#
 楼主| 发表于 2025-5-11 15:04:34 | 只看该作者
本帖最后由 slore 于 2025-5-11 15:10 编辑



改动后的GPU获取代码如下:

function gpu_info()
  local arr = {}
  local vid, gpu
  local i = 0
  local vid_num = Reg:Read([[HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\VIDEO]], 'MaxObjectNumber')
  if vid_num then
    for i = 0, vid_num do
      local video = Reg:Read([[HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\VIDEO]], [[\Device\Video]] .. i)
      if video then
        vid = video:match("{[%x-]+}")
        if vid then
          gpu = Reg:Read([[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Video\]] .. vid .. [[\0000]],
          {'DriverDesc', 'HardwareInformation.qwMemorySize', 'HardwareInformation.MemorySize'})
          break
        end
      end
    end
  end

  local mem_val = 0
  arr['name'] = '-'
  arr['memsize_info'] = '- GB'
  if gpu then
    arr['name'] = gpu['DriverDesc'] or '-'
    mem_val = gpu['HardwareInformation.qwMemorySize'] or gpu['HardwareInformation.MemorySize'] or 0
  end

  arr['memsize'] = mem_val
  if type(mem_val) == "string" then
    arr['memsize'] = string.unpack("I" .. #mem_val, mem_val)
  end
  if arr['memsize'] > 0 then
    arr['memsize_info'] = Fmt.SizeUnit(arr['memsize'], "%.0f ")
  end
  return arr
end

点评

显存大小有不是整数GB的情况,比如GTX 480是1.5G显存。  发表于 2025-5-11 19:12
回复

使用道具 举报

1130#
 楼主| 发表于 2025-5-11 19:37:01 | 只看该作者
hua_wuxin 发表于 2025-5-11 08:17
我想把CPU信息中的(R)和(TM)替换为®和™缩短下长度,但得到了乱码。我看了下page.systeminfo.lua ...
显存大小有不是整数GB的情况,比如GTX 480是1.5G显存。


那就保留1位小数,然后替换.0空格 为 空格。
回复

使用道具 举报

1131#
发表于 2025-5-11 20:27:22 | 只看该作者
slore 发表于 2025-5-11 13:35
补一个大小转单位的辅助函数。
下午更新一下。

while (quot >= 1024)建议改成while (quot > 999),循环里仍然除以1024不变。

之前举例的Intel集显显存,取一半是1073739904,用这段代码算出来是:
1024.00MB        1023.9981689453        MB
没能凑整到1GB上。

改后则是:
1.00GB        0.99999821186066        GB

点评

改成 > 1023 就好了。  发表于 2025-5-11 23:43
这种不是很标准,我先改成 quot >= 1000 吧。  发表于 2025-5-11 20:34
回复

使用道具 举报

1132#
发表于 2025-5-11 20:45:17 | 只看该作者
感谢楼主的分享,确实有用
回复

使用道具 举报

1133#
发表于 2025-5-11 23:54:12 | 只看该作者

谢谢楼主的分享
回复

使用道具 举报

1134#
发表于 2025-5-12 00:00:48 | 只看该作者

谢谢分享
回复

使用道具 举报

1135#
发表于 2025-5-12 00:10:09 | 只看该作者
谢谢科普分享!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2025-5-26 06:10

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表