无忧启动论坛

 找回密码
 注册
搜索

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

查看数: 353462 | 评论数: 1134 | 收藏 268
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2015-9-28 10:32

正文摘要:

本帖最后由 slore 于 2025-5-5 19:43 编辑 什么是WinXShell? 支持Windows 7,8,8.1,10,11, Windows Server 2008,2012,2016,2019,2022,2025以及以上版本的PE平台上的的代替explorer.exe的外壳程序。 (目前仍有exp ...

回复

slore 发表于 2019-2-3 13:33:23
lwb1 发表于 2019-2-3 11:06
还有一个问题
我把WinXshell设为PE默认的Shell
WinXshell启动时或打开文件夹时会出现一个命令提示符窗口
...


因为使用lua脚本扩展,做了一个 自动加载 lua_helper的lua脚本,结果呢,
它调用dir /b命令获取所有lua文件列表会启动一个cmd来运行的,所以会闪一下。
与文件夹关联没有关系。

打开:WinXShell\lua_helper\lua_helper.lua,删除红色的部分,添加蓝色的部分。

package.cpath = dllpath .. package.cpath

local f = io.popen('@dir /b '.. path .. '\\*.lua')
for line in f:lines() do
  if str.lower(line) ~= str.lower(__this__) then
    if suilib then
      suilib.print(line)
    else
      print(line)
    end
    require(line:sub(1, -5))
  end
end
f:close()


--[[
require('reg_helper')
require('os_helper')
require('str_helper')
require('io_helper')

--]]

点评

感谢楼主分享 PE中的必备软件之一 请教一下老大,最近发现有声网PE,播放声音为单声道,有无可能通过此软件的配置实现双声道?  详情 回复 发表于 2023-8-30 17:06
slore 发表于 2019-2-3 13:40:10
本帖最后由 slore 于 2019-2-3 13:43 编辑
lwb1 发表于 2019-2-3 10:07
打不开文件夹
要关联哪个资源管理器?
(我很清楚如何用注册表关联文件夹)


补充系统缺失的文件,可以使用内置的“打开文件对话框”模拟资源管理器,这种方式和explorer.exe几乎一模一样,而且PE系统的很多“浏览”按钮也可以使用了,方便打开文件。

如果是这种方式,你不用修改注册表,桌面打开文件夹,我的电脑,回收站,按Win+E打开资源管理器等都自动会由WinXShell.exe来打开

运行直接输入: system32这种方式打开文件夹,确实漏了关联注册表,你可以修改HKCR\Folder的关联到WinXShell.exe %1程序。

如果你使用第三方文件管理器,比如explorer++.exe,他们支持多窗口等其他特性,而且是绿色软件,单独一个exe就可以了,不依赖系统组件,比较便携。

这个情况,你修改好WinXShell.jcfg的配置桌面打开文件夹,我的电脑,回收站,按Win+E打开资源管理器等都自动会由WinXShell去调用第三方文件管理器,你不需要修改注册表

当然,同样运行直接输入:system32会提示无法找到关联程序,你可以修改注册表关联到WinXShell.exe %1,也可以直接关联到该第3方文件管理器:explorer++.exe %1。
slore 发表于 2019-2-2 18:27:43
lwb1 发表于 2019-2-2 16:24
explorer++.exe放那个目录?

如果你用第三方文件管理器,如 explorer++.exe。
你放到和WinXShell.exe相同目录,

WinXShell.jcfg你打开

  "::文件管理器":
  {
    "#::第3方文件管理器":"##{JVAR_MODULEPATH}\\explorer++.exe",
    "#padding-bottom":20
  },

"#::第3方文件管理器"开头的 #号删除掉就行了。

你也可以随意放到其他地方,这个路径修改就行了,比如:

"::第3方文件管理器":"X:\\Program Files\\explorer++\\explorer++.exe",

评分

参与人数 1无忧币 +1 收起 理由
Win7MEMZ-BX + 1 赞一个!

查看全部评分

slore 发表于 2018-8-20 21:54:55
Mouri_Naruto 发表于 2018-8-20 00:36
有关系的
因为使用含有GPL许可的所有项目和使用LGPL许可的静态编译的项目都有问询源代码在哪里的权利
...

推送到PExplorer这里了,
里面有2个分支PExlorer_v1.0,引入UI库前的最后一个Tag版本,
另外WinXShell改名后对文件管理器也有部分修正,所以把这部分修正单独抽取出来,
推送到WinXShell_shellpart的分支了,可以无依赖VS2015编译成功。

WinXShell的仓库预留着吧。

评分

参与人数 2无忧币 +6 收起 理由
Win7MEMZ-BX + 1 很给力!
Mouri_Naruto + 5 很给力!

查看全部评分

xintiandi 发表于 2018-1-29 22:21:52
本帖最后由 xintiandi 于 2018-1-29 22:33 编辑

的确是忘了加winpe参数,加上后,重启和关机都有效了。我想取消关机按钮,只保留重启,都是远程操作,一旦关机后,就不方便开机了,不知如何实现。

WinXShell.exe -ui -jcfg UI_Shutdown\main.jcfg

这个直接命令行可用,改到配置里面会出错。

点评

参考#254楼回复, "noshutdown":true, 就可以没关机菜单。 shutdwon_ui\\main.jcfg 斜杠需要写2个,在配置文件里。 main.xml文件,对关机按钮,配置个enabked=false,界面上关机也不能点了。参考其他的待  详情 回复 发表于 2018-1-30 09:38
friend8179 发表于 2015-9-29 14:32:09
楼主,还是静态编译,去除掉对VC库依赖吧
in9 发表于 2025-5-12 00:10:09
谢谢科普分享!
cyl279 发表于 2025-5-12 00:00:48

谢谢分享
yaowozhuce 发表于 2025-5-11 23:54:12

谢谢楼主的分享
sina@wei 发表于 2025-5-11 20:45:17
感谢楼主的分享,确实有用
hua_wuxin 发表于 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
slore 发表于 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空格 为 空格。
hack3678 发表于 2025-5-11 15:04:08
用心了
slore 发表于 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
rengrancunzai 发表于 2025-5-11 11:51:07
谢谢分享
cc2005 发表于 2025-5-11 10:23:00
看起来很牛逼。谢谢分享。
slore 发表于 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改用小字体。
hua_wuxin 发表于 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
hua_wuxin 发表于 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不正常。改掉后才好了。
kevinying16 发表于 2025-5-11 00:41:22
感谢分享
slore 发表于 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
slore 发表于 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字节数值解出来字节流。


hack3678 发表于 2025-5-10 23:20:51

谢谢分享
hua_wuxin 发表于 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
hua_wuxin 发表于 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
slore 发表于 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
hua_wuxin 发表于 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
2013qq413958 发表于 2025-5-8 12:25:18
感谢分享
yhage 发表于 2025-4-24 16:04:46
看起来和explorer差别不大
kenhun99 发表于 2025-4-19 14:19:45
小白完全看不懂
2013qq413958 发表于 2025-4-1 10:41:25
谢谢分享
gso 发表于 2025-3-18 06:25:30
谢谢分享!!!
562365203 发表于 2025-3-13 11:34:19
感谢楼主分享
Hjbob 发表于 2025-3-11 21:12:57
感谢分享
pda8888 发表于 2025-3-4 17:54:53
老大,请教一下:
win+e打开资源管理器后,如何让它显示中号的图标 ,而不是默认的列表?

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

闽公网安备 35020302032614号

GMT+8, 2025-5-23 18:30

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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