xintiandi 发表于 2018-8-6 10:27:42

在请教2个问题,
1、下图中,框上那个菜单,怎么退出。
2、系统信息中的,那些文字都可以随便自定义吗。

slore 发表于 2018-8-6 11:39:38

xintiandi 发表于 2018-8-6 10:27
在请教2个问题,
1、下图中,框上那个菜单,怎么退出。
2、系统信息中的,那些文字都可以随便自定义吗。
...

问题1.
这个画面,默认是失去焦点的时候自动隐藏,要完全退出的话,
右上角有个隐藏的退出按钮(鼠标移动上去鼠标会变)。

你也可以自己任意做一个任意大小任意颜色按钮放到任意位置,
名字叫 ::closebtn的话,点击就会退出。(UI_Launcher\main.xml)

如果想像其他的窗口一样表示一个X的话,只用补充红色部分添加按钮背景图片即可。
<Button name="::closebtn" bkimage="file='close.png'" width="16" height="16" padding="0,2,2,0" />

slore 发表于 2018-8-6 11:44:51

xintiandi 发表于 2018-8-6 10:27
在请教2个问题,
1、下图中,框上那个菜单,怎么退出。
2、系统信息中的,那些文字都可以随便自定义吗。
...

问题2

系统信息,所有的文字,所有的图片,所有的按钮,所有的布局,
全部是自定义的。(UI_SystemInfo\main.xml + main.lua)

这个画面布局和信息,是我高仿系统的信息做的,为了支持不同语言,
从dll中获取的资源字符串,你完全可以直接写到main.xml(text="任意文字")


xml的图片,属性和常见的html很相似的,你可以自己试着改改,
如果改不出来的话,把你想要的样子给我说下,我给你说怎么改。

levinsky 发表于 2018-8-6 11:53:00

谢谢分享

xintiandi 发表于 2018-8-6 11:59:25

本帖最后由 xintiandi 于 2018-8-7 15:18 编辑

slore 发表于 2018-8-6 11:44
问题2

系统信息,所有的文字,所有的图片,所有的按钮,所有的布局,


好的。那我抽时间在试试UI_Launcher,就是失焦后没有关闭,我才来请教。我测试的是wes7系统,被裁剪了的,默认点击我的电脑右键属性,是没有信息框的,没有任何反应。就是说是点不出系统信息的,我导入了handle_prop.reg注册表项,还是调不出来,难道这个功能要依赖系统的某些文件。看了一下main.lua,里面需要systemcpl.dll ,shell32.dll,包括sysdm.cpl等对应的mui文件都在系统里面加入了的。类似这样的代码不太懂 '#{@shell32.dll,31057}' ,猜测是调用shell32.dll中31057对应的文本,我用编辑器打开shell32.dll里面没有找到31057这项。main.lua中,哪些对应 windows版本,系统 等字样。下面代码中的几个按钮到比较好理解,要不然只能在有text的地方都改了试试,看效果。
sui:find('title').text = '#{@systemcpl.dll,1}'
sui:find('cphome_btn').text = '#{@shell32.dll,31057}'
sui:find('devmgmt_btn').text = '#{@systemcpl.dll,100}'
sui:find('rmt_btn').text = '#{@systemcpl.dll,101}'
sui:find('protect_btn').text = '#{@systemcpl.dll,102}'
sui:find('adv_btn').text = '#{@systemcpl.dll,103}'
sui:find('act_btn').text = '#{@systemcpl.dll,105}'
sui:find('more_label').text = '#{@shell32.dll,31091}'
sui:find('update_btn').text = '#{@systemcpl.dll,104}'

slore 发表于 2018-8-6 12:34:27

>好的。那我抽时间在试试UI_Launcher,就是失焦后没有关闭,我才来请教。

哦,这个有2种模式,全屏模式 UI_Launcher-full.jcfg,是失焦不退出的,再点击一次快捷方式才关闭。
普通的1/4左下角的方式是,失焦退出。(主要差别参数是UI_Launcher.jcfg中的"ondeactive":"hide")

我没有那么多平台,主要测试了WIN7和WIN10。

dll文件要用专门的资源查看工具,文本编辑器看不了的。
比如Resource Hacker。对了,WIN7之后微软引入了多语言资源mui,
虽然代码是'#{@systemcpl.dll,1}',
实际获取到资源的是“zh-CN\systemcpl.dll.mui”中找资源。

WES7是不是少这个文件。如果没有,可以自己写死,比如:

sui:find('devmgmt_btn').text = '#{@systemcpl.dll,100}'改成
sui:find('devmgmt_btn').text = '设备管理器'直接写死,如果系统不考虑太多通用性的话。

对了,WIN8的图片我忘了放了。

if vernum then -- need Administrator's right privilege to read the HKLM items
    sui:find('brand_img').bkimage = "file='" .. vernum .. ".png'"
end

当时是从注册表读取版本信息的,然后加载资源目录的6.X.png。
但是注册表这个地方要管理员权限,如果获取不到就是默认的WIN7的。
所以新版本加一个一个 app:info('ver')方法来获取系统版本信息,
但是这个方法只给WinXShell.lua用了,下个版本添加上。

目前的话,自己可以手动修改WES8的main.lua为
删除if vernum then
sui:find('brand_img').bkimage = "file='6.2.png'"
删除end

图片资源从C:\Windows\Branding\Basebrd\basebrd.dll导出(资源编辑器)。

slore 发表于 2018-8-6 12:45:32

xintiandi 发表于 2018-8-6 11:59
好的。那我抽时间在试试UI_Launcher,就是失焦后没有关闭,我才来请教。我测试的是wes7系统,被裁剪了 ...

main.lua中,哪些对应 windows版本,系统 等字样。

没写注释确实不方便,不过 lua尽量保持纯英文来支持不同语言的系统,不然英文系统上编码错误无法加载。

对于字符串资源的对应,主要是看main.xml的定义。

你可以看下,基本上是从左到右,从上到下布局的。

               <VerticalLayout height="120">
                  <HorizontalLayout height="20" >
                  <Label name="system_group" width="100" />
                  <Control height="2" padding="0,12,10,0" bkcolor="#FFCCCCCC" />
                  </HorizontalLayout>
                  <HorizontalLayout>
                  <VerticalLayout width="200" >
                      <Label name="cpu_label" />
                      <Label name="mem_label" />
                      <Label name="arch_label" />
                  </VerticalLayout>
                  <VerticalLayout padding="20,0,0,0">
                      <Label name="cpu_text" />
                      <Label name="mem_text" />
                      <Label name="arch_text" />
                  </VerticalLayout>
                  </HorizontalLayout>
                </VerticalLayout>
                <VerticalLayout height="150">
                  <HorizontalLayout height="20">
                  <Label name="host_group" width="420" />
                  <Control height="2" padding="0,12,10,0" bkcolor="#FFCCCCCC" />
                  </HorizontalLayout>
                  <HorizontalLayout>
                  <VerticalLayout width="200" >
                      <Label name="host_label" />
                      <Label name="fqdn_label" />
                      <Label name="desc_label" />
                      <Label name="workgroup_label" />
                  </VerticalLayout>
                  <VerticalLayout padding="20,0,0,0">
                      <Label name="host_text" />
                      <Label name="fqdn_text" />
                      <Label name="desc_text" />
                      <Label name="workgroup_text" />
                  </VerticalLayout>

system_group的下面,有CPU的LABEL标签(CPU),CPU的文本(实际内容),内存,构架信息。
host_group是机器组的信息,机器名,域名等。

所以”Windows 版本“ 对应的是
set_res('system_group', 1542)

slore 发表于 2018-8-6 12:53:49

xintiandi 发表于 2018-8-6 11:59
好的。那我抽时间在试试UI_Launcher,就是失焦后没有关闭,我才来请教。我测试的是wes7系统,被裁剪了 ...

我导入了handle_prop.reg注册表项,还是调不出来,难道这个功能要依赖系统的某些文件。

这个是【我的电脑属性】菜单的调用命令自定义,把菜单点击修改为
WinXShell.exe -ui -jcfg wxsUI\UI_SystemInfo\main.jcfg

因为依赖WinXShell.exe的路径,所以写到WinXShell.lua中(regist_system_property函数)。
当WinXShell启动时会更新,但是我觉得只有PE需要,所以加了判断只有PE才更新注册表。

UI_SystemInfo中的handle_prop.reg实际上不用了,为了知道让人知道怎么改的,
而且也不大,就保留了。
但是是旧版本的,UI路径不对了。自己手动导入的话,要修改下路径。

你可以先改成notepad.exe,看看你的WES7上是否可以劫持(右键属性可以打开一个记事本程序),如果可以,
那么改成UI_SystemInfo的新路径就可以了(WinXShell.exe是静态编译,不需要系统特别的依赖)。
HKEY_CLASSES_ROOT\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\properties\command

xintiandi 发表于 2018-8-6 13:13:28

好的。感谢这么详细的回复,我晚上抽时间在试试,那些dll,我是用Resource Hacker查看的,很多还是找不到,不知道为什么能显示出来。lua语言以前没有接触过。之前自学了一段时间的c#,c#的相关的应用层面的代码还基本能看懂个七七八八,只要涉及到api相关的还是看不懂。上周也是抽空余时间,改造了一个进程守护的软件,正打算用来守护winxshell,这几天要生二娃了,测试时间也不会太多。

xintiandi 发表于 2018-8-6 21:29:32

本帖最后由 xintiandi 于 2018-8-7 15:18 编辑

slore 发表于 2018-8-6 12:45
没写注释确实不方便,不过 lua尽量保持纯英文来支持不同语言的系统,不然英文系统上编码错误无法加载 ...

我试了一下windows版本对应set_res('edition_group',1538), 不是system_group'我修改成sui:find('edition_group').text = 'windows版本',就显示出来了。
set_text('status_group', 'Windows #{@shell32.dll,8981}'),我理解的是设置Windows状态,显示的文本是shell32.dll中8981资源处。

看代码应该是shell32中的8981资源。截图上已经显示了windows状态,已使用。ResourceHacker 打开shell32.dll就是没有找到8981.

我的系统中没有notepad,我平时编辑文本都是用的绿色版本的notepad2来代替的。所以右键菜单里面也没有建立记事本的快捷方式。不好验证是否可以劫持系统属性。

slore 发表于 2018-8-6 22:11:48

xintiandi 发表于 2018-8-6 21:29
我试了一下windows版本对应set_res('edition_group',1538), 不是system_group'我修改成sui:find(' ...

画面看差了,确实是edition_group才对.

dll文件要用专门的资源查看工具,文本编辑器看不了的。
比如Resource Hacker。对了,WIN7之后微软引入了多语言资源mui,
虽然代码是'#{@systemcpl.dll,1}',
实际获取到资源的是“zh-CN\systemcpl.dll.mui”中找资源。

#399 说了,得看mui文件.

你截图的位置的话是system32\zh-CN\shell32.dll.mui


这个系统状态是因为本来是激活,对PE没啥用,反而PE有运行时间限制,所以给出一个动态刷新的例子.


notepad.exe只是个程序,你没的话,用cmd.exe也行,主要系统程序的话,不用写路径方便测试.

xintiandi 发表于 2018-8-6 22:45:45

本帖最后由 xintiandi 于 2018-8-7 00:15 编辑

slore 发表于 2018-8-6 22:11
画面看差了,确实是edition_group才对.




好的,是我没有仔细看,等我测试完了再一起反馈。
试了UI_Launcher,默认是全屏方式,的确要再次运行的时候,才会关闭,但是1/4屏的方式,我按照你说差异修改了。一直没有出现过,始终是全屏的方式。所以没有测试到是不是失焦就关闭。我的电脑属性的问题完美解决,可以打开了。

slore 发表于 2018-8-7 00:32:00

xintiandi 发表于 2018-8-6 22:45
好的,是我没有仔细看,等我测试完了再一起反馈。
试了UI_Launcher,默认是全屏方式,的确要再次运行 ...

UI_Laucher你不用改啊,有2个配置文件(UI_Launcher.jcfg,UI_Launcher-full.jcfg)。
WinXShell.exe -ui -jcfg wxsUI\UI_Laucher.jcfg就是普通的1/4模式,
不过如果你开过一次全屏的得关闭掉进程再运行才有效.

slore 发表于 2018-8-7 00:34:06

xintiandi 发表于 2018-8-6 22:45
好的,是我没有仔细看,等我测试完了再一起反馈。
试了UI_Launcher,默认是全屏方式,的确要再次运行 ...

手动添加我的电脑属性菜单的话,菜单名建议改成 "属性(&R)", 我的注册表是默认用"属性",然后WinXShell.exe运行时自动(PE下)从系统菜单加载更新(还是为了适应全语言版本).

xintiandi 发表于 2018-8-7 00:53:53

本帖最后由 xintiandi 于 2018-8-7 01:00 编辑

slore 发表于 2018-8-7 00:34
手动添加我的电脑属性菜单的话,菜单名建议改成 "属性(&R)", 我的注册表是默认用"属性",然后WinXShell.exe ...

没有找到你说的改属性的地方,1/4屏的问题解决了。原来是测试的时候,我修改的配置文件在另外一个文件夹下,我搞混了。还有一个就是上次说的md5密码问题,如果是改成配置的话,winxshell启动的时候就得去检测是否有这个配置项,否则就要暂停,错误还要退出,得增加退出函数。

你说的是这样改吧

@="@shell32.dll,-33555"
;@="&Property"? shortcut name with be updated by WinXShell for locale language
"Position(&R)"="Bottom"

slore 发表于 2018-8-7 14:25:16

本帖最后由 slore 于 2018-8-7 14:28 编辑

xintiandi 发表于 2018-8-7 00:53
没有找到你说的改属性的地方,1/4屏的问题解决了。原来是测试的时候,我修改的配置文件在另外一个文件 ...

基本思路是:下载md5.lua放到lua_helper,然后在onshell函数中添加-p参数检测,
如果-p abc的话,通过,否则1秒后给shell窗口发送退出命令,shell退出。

附件覆盖到WinXShell目录即可。(如果自己修改了WinXShell.lua记得代码合并(我尽可能的将相关代码写在了一起)。)
主要修改:

新增check_password(),close_shell_check(),close_shell()函数,
onshell()函数添加close_shell_check调用。
ontimer(tid)函数添加1秒后结束shell的动作。

elseif tid == CS_TIMER_ID then
    app:call('KillTimer', tid)
    close_shell()
end



密码验证WinXShell.lua


用法:
WinXShell.exe -wes 启动后退出(无密码)
WinXShell.exe -wes -p 启动后退出(无密码)
WinXShell.exe -wes -p abcd 启动后退出(密码校验失败)
WinXShell.exe -wes -p abc   正常启动

密码自定义时可自己修改WinXShell.lua中的以下判断语句:

local function check_password()
...
if md5.sumhexa(pwd) ~= '900150983cd24fb0d6963f7d28e17f72' then    -- 's md5
    return 1 -- bad password
end
return 0 -- right password
end

xintiandi 发表于 2018-8-7 15:24:41

本帖最后由 xintiandi 于 2018-8-7 16:45 编辑

wes7中如果少了explorer.exe。控制面板会出错。不知道这个有没有办法处理,让彻底抛弃explerer,不知道控制面板里面的那些功能是否还要依赖explorer


托盘图标显示感觉有问题,没有和windows同步,有些图标是隐藏的,但是点击折叠后隐藏不了。


系统信息是不是少了截图中的3处,还没有模仿完。


带密码参数-p启动的问题,我测试没有成功,我测试的结果是,不管带不带-p参数都能启动 随便填-a -b 之类的也能启动,没有退出,难道没有对合法参数做检测。我下载的关闭函数,用beyong,核对了差异,融合后替换的。看调试信息应该是关闭函数没有执行,check password 已经生效了。

slore 发表于 2018-8-7 21:21:34

xintiandi 发表于 2018-8-7 15:24
wes7中如果少了explorer.exe。控制面板会出错。不知道这个有没有办法处理,让彻底抛弃explerer,不知道控制 ...

1.不要explorer,访问控制面板

基本不可能。因为很多UI都是explorer窗口显示的。
防火墙,网络,用户,程序卸载等。

下面这类弹出独立的对话框窗口的是可以不用(*.cpl)。
区域语言,鼠标,声音,具体网卡的属性设定等。

2.托盘图标隐藏

系统的设定的信息保存注册表,而且是很复杂的二进制流,
不是不能解析,PE用不到,所以就没有处理。

折叠是可以隐藏的,不是WinXShell自己设定的隐藏图标才可以,
时钟区域右键,通知图标设定。。。可以设置显示隐藏,
不过好像这个信息我没保存 {:2_121:},所以再启动得再设定。。。


"IconStreams"=hex:14,00,00,00,07,00,00,00,01,00,01,00,35,00,00,00,14,00,00,00,\
7b,00,53,00,33,00,38,00,4f,00,53,00,34,00,30,00,34,00,2d,00,31,00,51,00,34,\
00,33,00,2d,00,34,00,32,00,53,00,32,00,2d,00,39,00,33,00,30,00,35,00,2d,00,\
36,00,37,00,51,00,52,00,30,00,4f,00,32,00,38,00,53,00,50,00,32,00,33,00,7d,\
00,5c,00,72,00,6b,00,63,00,79,00,62,00,65,00,72,00,65,00,2e,00,72,00,6b,00,\
72,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,8d,c1,00,00,00,\
00,00,00,02,00,00,00,e2,07,02,00,46,00,46,00,56,00,51,00,2d,00,46,00,59,00,\
42,00,45,00,52,00,0a,00,56,00,61,00,67,00,72,00,65,00,61,00,72,00,67,00,20,\
00,bf,8b,ee,95,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\


3.系统信息的 分级,激活信息没有。
这些信息对PE没有用,而且也没调查这个信息怎么获取,
写个假的10.0也没啥意义,所以就没有。
需要自己改main.xml来添加。(label组件设置下bkimage)

4.密码验证
看输出一个有no password,并输出了Win Handle字样,另一个,
说明执行了结束SHELL窗口的代码了,但是没有获取到窗口信息,
窗口句柄为0x0,正常情况应该有个数据的。

我在WIN10和WIN7下都测试了,Shell_TrayWnd可以获取到的。
可否测试下,只用我的WinXShell.jcfg,或者把你的上传我试试看,
是不是合并的时候有什么地方变化了。

xintiandi 发表于 2018-8-7 21:51:10

slore 发表于 2018-8-7 21:21
1.不要explorer,访问控制面板

基本不可能。因为很多UI都是explorer窗口显示的。


winxshell.jcfg没有改,只改了winxshell.lua,我都打包了。

slore 发表于 2018-8-8 20:51:50

xintiandi 发表于 2018-8-7 21:51
winxshell.jcfg没有改,只改了winxshell.lua,我都打包了。

x86不能正常结束shell的原因知道了,lua的winapi.dll库的编译选项搞错了,编译成UNICODE版了,字符串无法正常工作,注册表的操作也不对。


下载附件替换就好了。另外,lua自带了os.exit命令可以退出程序,所以在onload上也加了密码不正确直接退出,这样不用等shell创建了再退出。

xintiandi 发表于 2018-8-8 23:11:04

slore 发表于 2018-8-8 20:51
x86不能正常结束shell的原因知道了,lua的winapi.dll库的编译选项搞错了,编译成UNICODE版了,字符串无法 ...

感谢这么快就解决了。我测试wes7的x86和64系统都没有问题,密码问题解决了。现在就剩wes8的控制面板问题,等解决了,我在一起测试wes8的系统,但是现在只有x86的wes8。

红毛樱木 发表于 2018-8-9 01:18:28

xintiandi 发表于 2018-8-8 23:11
感谢这么快就解决了。我测试wes7的x86和64系统都没有问题,密码问题解决了。现在就剩wes8的控制面板问题 ...

控制面板慢,有没有可能本来就是这样子?
因为在win8及之后的pe会有这种情况。
试试原始的explorer打开网络中心是否慢,就是任务栏网络图标右键那里。

xintiandi 发表于 2018-8-9 10:40:00

本帖最后由 xintiandi 于 2018-8-9 10:42 编辑

红毛樱木 发表于 2018-8-9 01:18
控制面板慢,有没有可能本来就是这样子?
因为在win8及之后的pe会有这种情况。
试试原始的explorer打开 ...

原始的控制面板打开不会慢,只要explorer运行一次后,在运行winxshell打开控制面板就正常了。但是如果explorer不运行,winxshell先运行,不管是否关闭winxshell 在打开控制面板也会变慢;只要explorer运行了一次后,在打开控制面板都正常,只是第一次运行控制面板有变慢的问题,重启之前都是正常的

红毛樱木 发表于 2018-8-9 11:18:30

xintiandi 发表于 2018-8-9 10:40
原始的控制面板打开不会慢,只要explorer运行一次后,在运行winxshell打开控制面板就正常了。但是如果e ...

正常的win8系统啥情况?

xintiandi 发表于 2018-8-9 11:52:39

本帖最后由 xintiandi 于 2018-8-9 12:00 编辑

红毛樱木 发表于 2018-8-9 11:18
正常的win8系统啥情况?

我没有用过正常的win8系统,现在用win10,我们用的wes7或8都是采用Command Prompt Shell with Custom Shell Support 方式,默认没有桌面的。wes8下直接打开控制面板,也就延时2,3秒,但是在winxshell中打开控制面板,要等差不多2分钟才出来界面,explorer到很快。这个问题等楼主测试了,应该就能解释了。个人感觉还是和初始化桌面之类的有关,感觉像是winxshell没有去执行explorer启动中的某个动作,所以control处于等待中,等到超时了,在启动的control,所以才会慢。但是如果winxshell先运行后,也会对控制面板有影响,感觉又有冲突,不知道怎么回事,最终还是得等楼主来揭晓答案。

slore 发表于 2018-8-9 13:20:52

红毛樱木 发表于 2018-8-9 11:18
正常的win8系统啥情况?

我杂忘了直接用正常Windows 8系统测试。。。
测试了,存在同样问题,原因也搞明白了,和之前说的一样,先
打开一次control初始化某个信息(explorer干的,或者不存在是控制面板的explorer程序会干),
然后就不卡了。

但是我之前代码导出的lua函数onfirstrun()是我的shell创建了才运行,导致
control以为explorer shell已经运行,还是会卡住。

在onload()方法中打开 控制面板再立马关闭就OK了。

slore 发表于 2018-8-9 13:26:07

本帖最后由 slore 于 2018-8-9 13:28 编辑

xintiandi 发表于 2018-8-9 11:52
我没有用过正常的win8系统,现在用win10,我们用的wes7或8都是采用Command Prompt Shell with Custom Sh ...

原因和回避方法已经在windows 8.1上确认了,再wes8上我再确认下就可以更新了。

解决方法就是原来说的,在WinXShell注册为shell窗口前,调用control.exe初始化一次。
但是我是在onfirstrun()函数中 初始化控制面板 太晚了(已经注册了shell),打算添加一个
beforeshell()函数,然后将"是否是第一次运行“作为app:info("isfirstrun")方式来处理。

function beforeshell()
if app:info("isfirstrun") then
      initcontrolpanel(win_ver)
end
end


目前的版本也可以在onload()中处理,不过每次启动shell都要 在一瞬间打开控制面板 关闭控制面板。
(按理说shell启动次数少,也无所谓)

function onload()
-- app:call('run', 'notepad.exe')
-- app:run('notepad.exe')
app:print('WinXShell.exe loading...')
app:print('CommandLine:' .. cmd_line)
app:print('WINPE:'.. tostring(is_pe))
app:print('WES:' .. tostring(is_wes))
if is_wes then
    initcontrolpanel(win_ver)
end
end

xintiandi 发表于 2018-8-9 13:55:22

本帖最后由 xintiandi 于 2018-8-9 14:12 编辑

slore 发表于 2018-8-9 13:26
原因和回避方法已经在windows 8.1上确认了,再wes8上我再确认下就可以更新了。

解决方法就是原来说 ...

刚刚测试了没有通过。奇怪的是如果wes7测试,改成if ver == '6.1' then,是有弹窗出来的,只是自己不会关掉而已,改成6.2,再wes8上,没有任何弹窗出来。

function initcontrolpanel(ver)
local ctrlpanel_title = ''
--4161    Control Panel
-- 32012    All Control Panel Items
if ver == '6.2' then
    ctrlpanel_title = app:call('resstr', '#{@shell32.dll,4161}')
else
    ctrlpanel_title = app:call('resstr', '#{@shell32.dll,32012}')
end
app:print(ctrlpanel_title)
app:run('control.exe')
app:call('sleep', 500)
local cp_win = winapi.find_window('CabinetWClass', ctrlpanel_title)
app:print(string.format("Control Panel Handle:0x%x", cp_win:get_handle()))
cp_win:send_message(WM_SYSCOMMAND, SC_CLOSE, 0)
end


按照你说的改成这样了
function onload()
-- app:call('run', 'notepad.exe')
-- app:run('notepad.exe')
app:print('WinXShell.exe loading...')
app:print('CommandLine:' .. cmd_line)
app:print('WINPE:'.. tostring(is_pe))
app:print('WES:' .. tostring(is_wes))
if is_wes and check_password() ~= 0 then
    os.exit(1)
end
if is_wes then
    initcontrolpanel(win_ver)
end
end

下面2个截图一个是启动后只运行control,另一个是启动后先运行winxshell再运行control


xintiandi 发表于 2018-8-9 17:43:02

本帖最后由 xintiandi 于 2018-8-9 17:57 编辑

现在测试可以了。能打开控制面板了。之前不知道怎么回事不行,不知道是不是和编码有关,因为beyoud打开的文档有些识别成ansi,有些又是utf-8,lua和jcfg好像也有差异。有时我用记事本改的。

之前出现了一次这样的提示,不知道是怎么导致的。

xintiandi 发表于 2018-8-9 22:18:19

本帖最后由 xintiandi 于 2018-8-9 23:43 编辑

这种方式没有问题,可以更新了。但是仅wes8需要这么处理,wes7是不需要的,我把function onfirstrun()里面的ver改成6.2,意思就是wes8的时候才初始化,但是经常在wes7下也会运行control,没有wes10的环境,就没有办法测试。
上次也遇到这样的问题,不知道后来怎么又好了,好像是全部替换了一遍文件,感觉替换的都没改动。现在是wes7 x64也出现一样的情况,我在wes8下测试好了,直接拷贝到wes7下的,我用的x64位版本的winxshell测试的,运行后,控制面板又自动打开了,感觉判断版本那有点问题。wes7,弹出控制面板,wes8也就解决了。如果wes7不弹出控制面板,wes8好像也不行了。不知道是哪个地方的配置又出了问题,这样的问题之前测试也遇到过,如果没记错的话,也出现了2,3次。就像下午测试wes8不行,晚上回来后文件都没有替换,就加了console运行一次后,就可以了。真是奇怪了。难道和虚拟机有关。之前测试的winxshellx86版本已经完美了。



找到问题了,下面这3行,wes8加上,wes7删除。感觉代码有点问题哦,对于wes8没有问题,但是对于wes7,好像有问题,假如是wes模式,就会初始化控制面板,控制面板的函数中,版本不等于6.2的时候也会执行control.exe
之前也是照搬没有仔细想,改成和onfirstrun函数中一致就好了。既判断是wes,也要判断版本是6.2,才初始化控制面板就行了。好了,所有问题完美解决。

if is_wes and win_ver == '6.2' then
    initcontrolpanel(win_ver)
end

页: 4 5 6 7 8 9 10 11 12 13 [14] 15 16 17 18 19 20 21 22 23
查看完整版本: [更新(2022/11/11) ModernUI回归] explorer再见,WinXShell你好!