utools本地搜索结果显示不全的某种解决方案

前几天发现utools的本地搜索只能加载出来约20条结果,滚动条拉到底部后不会加载新的搜索结果,而单独使用everything搜索结果正常。折腾了半天想起来调整过系统字体大小,去设置里将字体大小调回默认后问题解决

解决方案

先上解决方案:
如果更改了屏幕缩放,就到设置-系统-屏幕-自定义缩放中取消自定义缩放,改用系统提供的缩放选项。
如果更改了系统字体大小,就到辅助功能-文本大小(win10中叫做轻松使用)中将文本大小调整为100/125/150等系统缩放中提供的值

下面的又是太长不看版

折腾过程记录

在折腾的过程中,我尝试过卸载重装utools及everything,清理注册表等操作,但是都没有卵用。尝试过安装wox和listary,但是都出现了和utools相同的问题,都是滚动条触底时页面内容不会自动加载。同时在utools本地搜索插件的评论区发现了几条有相同问题的评论,贴图如下:

评论区.png
另一种解决方案.png

评论区提到的拖动窗口边缘调整大小以及设置高DPI缩放的两种办法让我想起来好像刚改过系统的字体大小,于是跑回去将字体大小复位,一切都恢复了正常。
痴呆.jpg

问题复现

实在是很好奇为什么会这个样子,于是又去调整字体大小吗,复现了这个问题,其中字体大小为100(默认值)/125/150等25倍值时utools在触底后可以自动加载,其他值都不行。而这几个值也是屏幕缩放选项提供的几个预设值。于是我又去尝试了自定义缩放,发现也是这几个值可以,剩下的值都会出问题,这就很迷惑了。

触底加载机制

utools是基于Electron和React构建的,而本地搜索使用的是滚动自动加载机制。在搜索React滚动加载的时候发现某些实现方式确实存在页面缩放时,判断是否触底的函数失效的问题。

参考:React之触底加载实现方式-3.7问题:页面缩放

解包尝试

为了找出时是何种原因,我解包了本地搜索插件的asar文件。utools的插件所在的位置为C:\Users\[用户名]\AppData\Roaming\uTools\plugins,而本地搜索文件由于内置了免安装版Everything,会单独列出来一个文件夹,此文件夹的名称和下面asar文件名称相对应,所以很好找。

解包前使用npm全局安装asar包,命令为npm install -g asar,解包命令为asar extract [需要解包的文件.asar] [解包路径]

asar文件格式

asar

ASAR文件是一个归档文件,用于使用Electron(一个用于构建跨平台程序的开源库)为应用程序打包源代码。它以类似于.TAR存档的格式保存,其中包含在存档中的文件(如.HTML、.JS和.CSS文件)在不使用压缩的情况下连接在一起。
asar 属于无压缩类型的,也没有经过加密处理的,所有包含的文件的二进制数据都直接添加到 .asar 文件中,该文件头部包含一个 JSON 格式的字符串,记录其中包含的文件结构以及所有文件的起始位置以及文件长度。

引用:.ASAR 文件格式
引用:Electron asar 格式详解

解包后找到index.js文件,使用在线工具美化,让它变成人类能够看懂的样子,然后。。。看懵了。。。三万多行没有注释的代码,前端只有菜狗水平的我根本看不懂。。。不过确实出现了load scroll toggle这几个关键词

挠头.jpg

不负责任的推断

100缩放.png
121缩放.png
125缩放.png

上面三张图对应的文本字体大小分别是100、121、125,可以看到结果列表区域显示的条目并没有变,只是每一条所占的高度增加了。

根据搜索到的几种滚动记载机制,我不负责任的推断(毕竟对前端不熟)。滚动加载机制的判断条件是可视区高度 + 滚动距离 >= 内容实际高度。当系统缩放改变后,搜索结果每一列所占用的高度增加,内容实际高度发生改变,导致无法达成触发条件。

未解之谜

那么问题又来了,为啥125%和150%等缩放可以正常使用呢?查了半天也没找到啥有用的信息,那就摆烂吧

摆烂.gif