无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
12
返回列表 发新帖
楼主: lhc0688
打印 上一主题 下一主题

[已解决] 只差一步:解决PE中DPI显示缩放难题!

    [复制链接]
31#
发表于 2022-5-26 10:13:36 | 显示全部楼层
527104427 发表于 2022-5-25 21:47
不玩了,最后再憋个大招:

根据szwp提供的网址研究了一下,发现系统早就为我们算好了 ...

似乎也不是很好,win7系统不支持函数SystemParametersInfoW

点评

设置不了,但可以查询。只要查询到建议值,直接干注册表  详情 回复 发表于 2022-5-26 10:15
回复

使用道具 举报

32#
发表于 2022-5-26 11:43:57 | 显示全部楼层
本帖最后由 hhh333 于 2022-5-26 11:46 编辑
527104427 发表于 2022-5-26 10:15
设置不了,但可以查询。只要查询到建议值,直接干注册表
根据微软官方的说法是这么理解的,查询支持win2 ...

我也是这么想的,先用老的查表法,ret158>0时才用新方法。win7的ret158确实是0,说明返回没成功
回复

使用道具 举报

33#
发表于 2022-5-26 14:34:45 | 显示全部楼层
527104427 发表于 2022-5-26 10:15
设置不了,但可以查询。只要查询到建议值,直接干注册表
根据微软官方的说法是这么理解的,查询支持win2 ...

用数字0调用即是推荐值(自动值)和能够直达的最大值也是猜的呀
回复

使用道具 举报

34#
发表于 2022-5-26 18:15:22 | 显示全部楼层
本帖最后由 hhh333 于 2022-5-27 07:13 编辑
527104427 发表于 2022-5-26 17:29
这是兴趣的问题,不是时间的问题。我目前只有一个23寸显示器,什么都测不了

主要是兴趣玩一下,顺便跟大佬们学习一下PECMD脚本,也蛮有意思。
又把脚本修改了一下: setdpi.7z (4.35 KB, 下载次数: 24)
1、ret158>0,ret159应该也>0,因此我的脚本检测ret159>0再刷新有点画蛇添足;
2、我的前面程序存在一个目标DPI值只要通过注册表法时标志的是上一次的当前DPI,这次修正了;
3、只要是采用注销法,刷新桌面就没有意义了,这次改了。
回复

使用道具 举报

35#
发表于 2022-5-26 20:48:32 | 显示全部楼层
527104427 发表于 2022-5-26 18:33
根据 227# 大佬发的表格,ppi最高的只有183.58,换算成dpi顶多也只有200%,貌似没有200%以上的,这个你怎 ...

没有大分辨率的屏不好试
回复

使用道具 举报

36#
发表于 2022-5-26 21:11:07 | 显示全部楼层
527104427 发表于 2022-5-26 20:48
你的意思是这样的吧:
1920x1080计算最大dpi:1080/6.25/96=1.8(约175%)
3840x2160计算最大dpi:2160/6 ...

基本对得上
900-1.5
1080-1.8
回复

使用道具 举报

37#
发表于 2022-5-26 21:29:06 | 显示全部楼层
527104427 发表于 2022-5-26 21:25
那这个分辨率应该是最大分辨率,而不是当前的分辨率吧?
猜想正确的话,那又能整活了

500算起来只要3000,4320对应的是7.2
回复

使用道具 举报

38#
发表于 2022-5-27 06:24:14 | 显示全部楼层
本帖最后由 hhh333 于 2022-5-27 07:26 编辑
527104427 发表于 2022-5-26 21:34
试了一下,居然是按当前分辨率算的,改了分辨率,最大DPI也跟着改!
你说的问题好解决,大于500%的一律 ...


win8pe中有个超级怪现象,如果先切到125%,再切自动,屏幕会变成75%;如果先切到150%,再切自动屏幕会变成50%,图标缩小一半差不多看不清了。
经追踪,是因为call $--bool --qd --ret:ret158 user32.dll,SystemParametersInfoW,#158,0,*pvParam,1这个函数在切125注销后第一次运行,vParam将返回1;同样切150%以后第一次运行vParam将返回2;
因此导致返回1的算出的DPI为75%,返回2的为50%;但奇怪的是第二次运行函数又正常了,vParam返回0
刚才在脚本中运行两次158也不行,但在PECMD窗口中直接运行,第一次不正常,第二次正常。
目前只有加一条ifex $%dpi%<100, set dpi=100



回复

使用道具 举报

39#
发表于 2022-5-27 07:19:19 | 显示全部楼层
本帖最后由 hhh333 于 2022-5-27 07:41 编辑
527104427 发表于 2022-5-26 23:33
我发现你的发言都很有水平,受益匪浅,只是有些不好理解

SystemParametersInfoW函数可不可以设成75%或50%?既然是缩放,不能只有放没有缩吧?注册表注销法反正是可以的
这是75%的效果


回复

使用道具 举报

40#
发表于 2022-5-27 09:15:10 | 显示全部楼层
比较关心缩小能不能用函数来整。缩小屏幕上能够显示更多东西,只要显示器够大够清晰,眼力足够好,也是有用的
回复

使用道具 举报

41#
发表于 2022-5-27 09:17:17 | 显示全部楼层
还是再增加两个比例,50%,75%反正用注册表法可以实现
回复

使用道具 举报

42#
发表于 2022-5-27 15:30:59 | 显示全部楼层
本帖最后由 hhh333 于 2022-5-27 20:06 编辑
2011whp 发表于 2022-5-27 13:50
缩小?

50% 出现过?从现实来说,好像没出现过 dpi48的设备(特殊的除外),crt显示器 已经 dpi 72 了 ...

经过测试,Win7/8可以通过注册表设置为50%、75%,Win8.1以上最低是100%即96,这个值HKCU\Control Panel\Desktop\WindowMetrics\AppliedDPI在注销以后再进桌面看又恢复到96,不知道有不有强制的方法。


又修改了一下,支持出现75%,50%等100%以下的菜单项(修改脚本的SeqBase变量为-2,可以不出现50%菜单项,-1可以不出现75%菜单项): setdpi.7z (4.65 KB, 下载次数: 18)
5大说不玩了,都散了吧?



回复

使用道具 举报

43#
发表于 2022-5-27 21:16:03 | 显示全部楼层
527104427 发表于 2022-5-27 19:51
按照大佬们指点的最大dpi计算公式,在注销前先来个友好提醒,默认选否,免得没保存手头的工作就被干掉 ...

1、SystemParametersInfoW的158返回必须这<=0的数吗?在什么情况下返回非零的数?
2、观察到的SystemParametersInfoW158功能异常在Win10以下的系统如win8/8.1都有,而恰恰SystemParametersInfoW功能可以说对win10以下的系统都没用,反正都是用注册表注销法的。因此可以更简单一点,只要是win10以下系统在非system用户下,直接改注册表注销,否则什么也不干;
回复

使用道具 举报

44#
发表于 2022-5-27 22:48:55 | 显示全部楼层
本帖最后由 hhh333 于 2022-5-27 22:50 编辑
527104427 发表于 2022-5-27 19:51
按照大佬们指点的最大dpi计算公式,在注销前先来个友好提醒,默认选否,免得没保存手头的工作就被干掉 ...

这是在win8.1中运行你的程序的log
麻烦看一下: setdpi.7z (5.84 KB, 下载次数: 5)
158运行50次也不行,但再进入恢复正常
  1. set$# pvParam=*4 0
  2. call $--bool --qd --ret:ret158 user32.dll,SystemParametersInfoW,#158,0,*pvParam,1
  3. set?ints pvParam=vParam
  4. call $--qd# --ret:ret159 user32.dll,SystemParametersInfoW,159,0,0,1
  5. mess pvParam=%pvParam% vParam=%vParam% %ret158% %ret159%
复制代码
上面代码运行两次,第二次数据正常




但是文件内函数调用N次数据就不对
回复

使用道具 举报

45#
发表于 2022-5-28 09:07:11 | 显示全部楼层
527104427 发表于 2022-5-28 00:21
我记得win7是负数。
那这就没办法了。

把逻辑重新整理一下:
1、Win10以下,不用函数,如果是非SYSTEM用户则写注册表然后注销,否则退出;有效避免了函数在这些系统中各种异常结果;
2、Win10以上,先用函数,超过函数范围,并且非SYSTEM用户则写注册表然后注销,否则只是函数作用后的结果;
3、每次写注册表+注销前进行询问确认;
4、maxautodpi既然是固定的就直接用查表法,用计算法还麻烦些还得规范计算结果;


回复

使用道具 举报

46#
发表于 2022-5-28 10:01:27 | 显示全部楼层
本帖最后由 hhh333 于 2022-5-28 17:15 编辑
527104427 发表于 2022-5-28 00:21
我记得win7是负数。
那这就没办法了。

把逻辑重新整理一下: setdpi.7z (4.53 KB, 下载次数: 23)
1、Win10以下,不用函数,如果是非SYSTEM用户则写注册表然后注销,否则退出;有效避免了函数在这些系统中各种异常结果;
2、Win10以上,先用函数,超过函数范围,并且非SYSTEM用户则写注册表然后注销,否则只是函数作用后的结果;
3、每次写注册表+注销前进行询问确认;
4、maxautodpi既然是固定的就直接用查表法,用计算法还麻烦些还得规范计算结果;

注:调试这个的时候,如果有注销,PE中 SYSTEM/Administrator切换时会导致切Admin后又切回SYSREM再次切回admin会出问题,再次回切admin使用的是tscon 2,而这个已经被注销了所以就切不回了,使用tscon 3可以成功,经反复测试,如果注销偶数次,用编号2,奇数次用3可以再切回。因此在再次切回Admin的命令中两个都写上。
  1. `再次登录Admin
  2. _SUB Admin2
  3. EXEC !TSCON 2
  4. EXEC !TSCON 3        //注销后再进入的为编号3
  5. _END
复制代码



回复

使用道具 举报

47#
发表于 2022-5-28 19:17:56 | 显示全部楼层
527104427 发表于 2022-5-28 00:21
我记得win7是负数。
那这就没办法了。

请问:
call $--ret:LogPixels Gdi32.dll,GetDeviceCaps,#%hdc%,#90         //dpi高      //#88为宽
前面用88也没有出错啊?这个有讲究吗?
回复

使用道具 举报

48#
发表于 2022-5-28 21:31:19 | 显示全部楼层
527104427 发表于 2022-5-28 20:25
昨天红毛悄悄告诉我,win10.0.14393 以上系统才支持SystemParametersInfoW函数,好吧,再接着改!
把推 ...

win7与其他不同?最大DPI低些?
回复

使用道具 举报

49#
发表于 2022-5-29 07:02:36 | 显示全部楼层
527104427 发表于 2022-5-29 00:11
我这是如此。测试环境单调,没啥权威性

应该不对,我这个Win7是1440X900,最大DPI就是150%

刚好是900/600*100
回复

使用道具 举报

50#
发表于 2022-5-29 07:35:42 | 显示全部楼层
527104427 发表于 2022-5-29 00:11
我这是如此。测试环境单调,没啥权威性

另外,规范dpi是不是不用判断两个条件
  1. `规范dpi档次
  2. ifex $%dpi%<50, set dpi=25
  3. ifex $%dpi%>50, set dpi=50
  4. ifex $%dpi%>75, set dpi=75
  5. ifex $%dpi%>100, set dpi=100
  6. ifex $%dpi%>125, set dpi=125
  7. ifex $%dpi%>150, set dpi=150
  8. ifex $%dpi%>175, set dpi=175
  9. ifex $%dpi%>200, set dpi=200
  10. ifex $%dpi%>225, set dpi=225
  11. ifex $%dpi%>250, set dpi=250
  12. ifex $%dpi%>300, set dpi=300
  13. ifex $%dpi%>350, set dpi=350
  14. ifex $%dpi%>400, set dpi=400
  15. ifex $%dpi%>450, set dpi=450
  16. ifex $%dpi%>500, set dpi=500
复制代码


回复

使用道具 举报

51#
发表于 2022-5-29 09:10:42 | 显示全部楼层
527104427 发表于 2022-5-29 07:48
这我知道,但微软官方给的公式就是  分辨率高/720,多少还是给他些尊重吧

https://docs.microsoft.com ...

我那判断看起来简洁但容易出错,上面就是错的,要把值先保存一下,再判断,还得改>为>=
回复

使用道具 举报

52#
发表于 2022-5-29 12:40:45 | 显示全部楼层
本帖最后由 hhh333 于 2022-5-29 13:23 编辑
527104427 发表于 2022-5-29 12:11
仔细看了一下你这个代码,貌似不对哦,假如传入的dpi=600,在第二句就被阻断了,变成dpi=50了,后面肯 ...

是的有问题,如下改下也可:
  1. set d=%dpi%
  2. ifex $%d%<50, set dpi=25
  3. ifex $%d%>=50, set dpi=50
  4. ifex $%d%>=75, set dpi=75
  5. ifex $%d%>=100, set dpi=100
  6. ifex $%d%>=125, set dpi=125
  7. ifex $%d%>=150, set dpi=150
  8. ifex $%d%>=175, set dpi=175
  9. ifex $%d%>=200, set dpi=200
  10. ifex $%d%>=225, set dpi=225
  11. ifex $%d%>=250, set dpi=250
  12. ifex $%d%>=300, set dpi=300
  13. ifex $%d%>=350, set dpi=350
  14. ifex $%d%>=400, set dpi=400
  15. ifex $%d%>=450, set dpi=450
  16. ifex $%d%>=500, set dpi=500
复制代码

咸得蛋疼测了下耗时:


回复

使用道具 举报

53#
发表于 2022-5-29 13:56:10 | 显示全部楼层
本帖最后由 hhh333 于 2022-5-29 13:59 编辑
527104427 发表于 2022-5-29 13:41
哈哈哈,这是强迫症犯了吧?

哈哈,我们都太笨了。根本不必这么写,愚蠢限制了我们的想像力
  1. ifex $%dpi%>250,set v=50!set v=25
  2. calc dpi=int(%dpi%/%v%)*%v%
  3. ifex $%dpi%<50, set dpi=25
  4. ifex $%dpi%>500, set dpi=500
复制代码
永远是这几条
节约400多微秒,每次都是
回复

使用道具 举报

54#
发表于 2022-6-1 16:14:08 | 显示全部楼层
527104427 发表于 2022-6-1 10:40
现在都是自动计算的。
非得改的话,把这段:
_sub SetAutoDpi *

这个合理一点
回复

使用道具 举报

55#
发表于 2022-6-1 17:02:38 | 显示全部楼层
527104427 发表于 2022-6-1 16:40
感觉搞个GUI挺好的,有时间慢慢玩

也是一种方案,估计使用右键菜单习惯些
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-5-3 09:10

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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