完成!更新到1.56C
因为感觉不大灵活,所以关于标题,以reg::
打头的排除项将被视为正则表达式匹配
除了这两个更新之外还有一个重要更改——以至于我要为它分配一个新版本号:修正所有ini、ahk的编码为UTF-16 LE
1.56C正则解决窗口模糊匹配的问题!
另外发现固定搭配排序也固定下来了,这也符合我的使用偏好。
忘记了一件事,我的 Windows 10 语言和输入法设置是这样的,只设置一个语言:中文,输入法为搜狗,默认状态是中文。所以每次打开新软件,都是「搜狗-中文」状态,可能这和大多数人不一样,这应该是只有我碰到这个问题的原因。
固定顺序是为了取代之前快切的“冻结模式”功能,很高兴您能指出固定顺序的小错误
请问新版在哪里下载啊?
继续用了一天,体验超棒!
不过,又发现了一个小问题: 软件关闭后,曹操快切不会把它从窗口列表中移除,只能重启(菜单 Reload),窗口列表才会更新。如果不管它会怎样?再次打开刚关闭的软件,会在窗口列表中发现两个它。
上面截图展示的是,我先关 Boardmix 闭再打开,它在窗口列表中出现了 2 次,而且热键 a 无法激活正在运行的 Boardmix(可能是它排在下面?)
还有一个让我很难受的地方是每次从 Boardmix 窗口通过曹操快切激活另一个窗口,Boardmix 就在任务栏上闪烁,为了让它停止,只能去点一下。
录屏:https://img.picgo.net/2025/02/05/-63dc3b9110ae9409.mp4
测试旧版曹操快切没有这个问题,不知能否看一下什么原因,是否方便处理?
完成!蓝奏云更新至1.57C,github因为环境原因稍后跟进。
其中无法删除的bug已修复
关于窗口闪烁,ahk的设计者给出了解决方案
#WinActivateForce
跳过温和的方法而直接使用强制的方法激活窗口.
…
尽管这个指令不能让窗口激活的更迅速, 不过它也许可以阻止在快速连续激活窗口时任务栏按钮的闪烁.
啥也不说了,一键三连
大佬还在吗?又来报告问题了。
整体而言使用很满意,就是稳定性似乎有点问题,具体是用鼠标点击的时候,有几率报错和闪退。下面的录屏的操作方式:
- `键呼出窗口列表
- 立即用鼠标点击选择窗口
第一个录屏,报错然后退出:
第二个录屏,闪退:
这是ahk性能不足,也不支持多线程的问题。如果硬要使用ahk解决,要么损失性能,要么很不稳定
准备新开一个分支,使用高级编程语言重写此软件。预计是R分支或者P分支,使用rust或者c++重写。您有什么建议嘛
原来是性能问题。操作慢一点其实可以避免,只是有时候难免点快。
我不懂编程,给不出技术上的建议。只能从用户角度说说看法:
我提的需求基本上都实现了,功能上没有新的需求。
如果从我个人偏好考虑,我觉得目前固定搭配的排序还不算是完全确定的,它按照启动顺序排列,这样还是不太方便形成肌肉记忆,我希望他能固定下来,如果能按照setting.ini里的顺序来固定排列的话,每次打开软件的位置就能保持一致了,这样用起来会更顺手。
要是能用其他语言重写软件,既能保留现有特性,又能提升性能和稳定性,那当然是极好的。
对了,新版和旧版相比,还有一个很好的特性,就是从资源管理器拖动任意文件,鼠标按住不松手,这时按下`键,激活目标窗口,文件的拖拽状态不会被打断,可以很方便的拖动文件到软件中。原版有很大几率会失败,新版100%成功,值得一万个赞。
固定位置显示
思考(建议略过)
关于固定搭配,您提出的问题需要解决,并且很容易。但我发现一个进一步的问题:固定搭配会出现排除无效窗口的情况,故:如果有三个固定搭配,其中第一个没有匹配到现有窗口,则它不会显示。
本来想增加一个功能,可以固定某项目的位置,但是发现很容易产生冲突。快捷键固定和显示槽位固定加一块,就像给一元二次方程的次数加了一,很难处理…
考虑到您的需求,我们可能需要进行一些非常可怕的修改。很明显,您是鼠标用户,所以您对它的位置也非常敏感。如果需要配置某个窗口,它的固定的显示位置的话,就要考虑可能产生冲突的情况。
之前快捷键产生冲突的情况是:直接为两个产生冲突的窗口分配相同的快捷键,使用这个快捷键,可以在两个窗口之间进行选择。
如果两个固定位置的窗口产生了冲突,那么他们必须显示在同一个位置。也就是说,我们要在同一个位置做到切换两个窗口。
于是我们引入窗口组这个概念:在菜单中,每一项代表的是一组窗口,如果这一组窗口中只有一个元素(储存着句柄),点击这个窗口组会激活这一个窗口元素。如果这一组窗口中有不止一个元素,那么点击这个窗口组会弹出一个下级菜单,显示一组窗口。您可以在这一组窗口中选择您需要的那个
很好,我们想到树状图结构,我们可以在树状图结构中显示这一组窗口。这样就是展开下一列的树
嗯,那么是否在第二级的树下面还要再设计一集呢?比方说可以按照规则匹配同进程匹配同标题匹配。不行,如果在第二级下面再分多级的话,会显得很乱,同时切换效率也不够高
那我们只设置一个二级的树结构,再定义,激活和选定两个操作。如果对一个窗口组进行激活,假设这个窗口组下面只有一个窗口,那么这个激活操作就会激活这个窗口。如果这个窗口组下面有多个窗口,则激活操作,会让窗口组展开这些窗口。我们还要考虑激活和选择是否都可以让窗口组展开它。当激活一个窗口元素时,就会激活窗口元素储存的对应的句柄。那我们可能需要以下设置
名单设置
(略去
操作设置
配置1
程序设置
激活
当(键名)键(按下/抬起)时激活菜单
当程序启动时激活菜单
在(左/右/上/下角 / 居中 / 鼠标)处显示菜单
关闭
当(键名)键(按下/抬起)时关闭菜单
当其他窗口被激活时关闭菜单
当鼠标离开窗口时关闭菜单
菜单设置
选择
启用鼠标左键选择窗口
启用方向键选择窗口
启用鼠标滚轮选择窗口
启用快捷键选择窗口
选择时将窗口拉起至次顶级
激活
启用回车键激活窗口
启用空格键激活窗口
启用鼠标左键激活窗口
启用快捷键激活未分组的窗口
分组
启用快捷键相同分组
启用特定位置相同分组
启用标题相同分组
启用正则表达式匹配相同分组(!)
非常可怕的设置,这会导致程序很乱,保留吧
我们继续思考,有什么更简洁的结构可以让用户选择窗口呢?
我们可以借鉴之前那种在用同一个快捷键,在两个冲突的窗口之间切换。那么我们就引入一个概念:窗口合并
很好,这个概念参考了WINDOWS任务栏的合并操作。如果有快捷键、位置、标题相同的窗口,将它们合并到一项中。这个项储存一个句柄数组。在激活这个项时不会激活窗口,而是将窗口拉到次顶层。点击这个项n次,他就会拉起第n个句柄所对的窗口。接下来,只要关闭菜单即可。
进一步合并同类项,我们可以把所有窗口激活操作,都改为将窗口拉起至次顶层。现在更改窗口激活的定义:窗口激活代表将窗口拉起至次顶层。
现在我们可以进行如下更改
如果快捷键、鼠标左键、回车键按下
当前选中项不是合并,则激活并关闭菜单
当前选中项是合并
太麻烦了,还有更简单的,回到上面的树方案,激活的定义还原
取消设置,直接这样:按功能键分类
滚轮:只能上下选择,选中不止一个的窗口组就自动展开,离开树自动关闭
方向键:按树状图标准处理
快捷键:点击后如果窗口组只有一个项目则(激活/不动),如果有多个则(立即展开,点按一次再展开)立即展开到第二级第一个,点按n次选中第二级第n个
回车:没有子项的项直接激活,有子项的展开
空格:直接同上,映射到回车算了
这样就没有需要设置的东西了,设置这些功能是否启用就行
然后是小设置:在一级、二级中是否启用切换就把窗口拉到次顶级;菜单关闭时是否激活选中窗口(窗口激活的时候关闭菜单,菜单关闭时会激活窗口,这里可能会有冗余,所以要注意处理)
快捷键其实无所谓位置不位置,所以构建一个列表,其中
[显示位置,快捷键,窗口句柄数组]
不对,按照快捷键的做法,我应该把那个位置空出来的,在没有窗口匹配的时候
检查该方案的可行性;好,很明显在有多个窗口匹配的时候还是需要处理。存疑,是否要留空?
我们继续。初始化的时候,我们一个一个定位:先匹配例外列表,
如果现有窗口指定了快捷键
如果地图中没有快捷键:添加快捷键,加入窗口
如果地图中有快捷键:()把窗口句柄push到对应的组
如果现有窗口指定了显示位置
不行
重新来过
设置一个优先级规则,允许每条规则定义快捷键或者显示位置。靠近文件头的优先级越高。
思考失败
进行了思考,最后很遗憾地放弃[添加固定显示槽位]这个功能
上面看不懂也没关系,不影响您理解…我的语言组织能力就到这里,接下来是重点
现在的方案是:
假设有n条固定搭配,直接空出n行来显示它们。如果某条搭配实际上没有窗口匹配,直接显示空行。如果某条搭配有多个窗口匹配,显示一个树状图。
那么显示方式就要三选一了
1,直接创建一个新列表专门储存固定搭配(出现两个列表)
2,在原有列表的头部储存固定搭配
3,提供1和2,让用户自己决定用哪种
合并同类项
上面提到过,在固定搭配列表中,相同规则匹配到的窗口被合并到一项中,点击此项可以展开,然后进一步选择
在一般窗口列表中,标题相同的窗口应该也要被合并。
此功能效果类似于Windows任务栏的窗口合并,您觉得是否有必要添加?
没想到简单的需求,如果要做好普适性,需要考虑这么多种情况,辛苦了。
空行问题
如果固定列表的软件没有运行,就显示空白,是这样吗?
我觉得也可以这样,如果没运行还是显示该软件图标和名称,点击就运行。
显示问题
显示方式1,我有一点不清楚,就是新列表和老列表怎么摆放?
显示方式2,这应该和我最初的设想一致。
为了避免我们之间的理解出现偏差,我画了一张示意图,看看我们的想法是否一致:
我最初的设想就是在原有列表上方(为了便于区分,应交界处加一根分割线)加上固定列表
这里置顶列表和固定列表的窗口用户都应该会自定义快捷键,正常情况不会在置顶和固定列表都配置同一个软件。所以置顶列表似乎可以看成把固定列表的某几个窗口置顶。
窗口合并问题
至于多窗口软件的合并问题,我觉得分组可行,考虑到效率问题,我觉得可以这样设计:比如分配edge浏览器热键是e,它有子窗口1、2、3,那么按e,列表立即切换到子页,依次显示1、2、3,这时用户按下相应数字键即可切换,当然1、2、3也可以用字母替代。目的是为了2键直达。
慎重地思考后,发现您的方案确实很棒!
再做点更改:取消固定搭配列表的置顶,不特别处理固定搭配窗口的位置。这样将固定搭配列表和置顶列表分开,更加模块化(毕竟使用快捷键固定搭配的用户一般不会对位置很敏感)
示意
a 置顶窗口1
f 置顶窗口2
g 置顶窗口3
b 普通窗口1
c 固定搭配窗口1
l 普通窗口2
n 普通窗口3
d 固定搭配窗口2
...
关于同规则合并
除了同标题的合并以外,同一规则匹配到的也合并为一项
就是以窗口规则为主体
窗口规则示例
[rule1]
title=xxx
title_reg=xxx
exepath=xxx
exepath_reg=xxx
排除=false
置顶=true
快捷键=a
允许用户将同一规则匹配到的多个窗口合并为一项,合并后
窗口列表
列表1
合并前 合并后
A A
B1 B1+B2
B2 C
C
这样保证了C总在第三个位置
即 第n条置顶规则所匹配的窗口 总在 第n项或第n项内 。
同时,也保证按下快捷键,要么直接激活窗口,要么展开二级菜单。
您发现,到这里,已经很像Windows任务栏的一些功能了,于是我们继续
窗口预览
在二级菜单中显示选定窗口的预览,以便精确地转到窗口
程序启动
开始觉得很奇怪,但是仔细想想还不错。如果用户设置了exepath,且当前规则没有匹配到窗口,则显示一个灰色的项,点击则启动exepath
类似Windows任务栏的固定快捷方式
暂时就这样,您觉得呢
三点都完全同意,你总结优化后的方案很合理
是要整活了吗,窗口都能预览?