[AHKv2] DialogSwitch 不同对话框显示独立菜单的Ctrl+G跳转功能

前言

目前,我用过的类似 Ctrl+G 的路径跳转工具为数不少,但始终没有能完全满足我需求的。RunAny 虽然部分实现了需求,但由于其菜单会冲突覆盖,实际体验并不理想。

具体来说,现有工具的问题在于,会将所有收藏的文件或文件夹路径不加区分地堆砌在一起。然而在实际工作中,并非在任何场景下都需要看到全部路径。例如:

  • Notepad 中,几乎不需要访问存放图片素材的文件夹。
  • 同理,在 Photoshop 中,文本文件相关的路径也显得多余。
  • 即使是 同一个应用程序,在 不同的对话框 中,对路径的需求也大相径庭。以 VS Code 为例,存放项目的目录和存放工作区的目录通常是分开的;当对话框只与项目有关时,就不需要显示工作区路径,反之亦然。

基于这个需求,单独写了一个ahkv2脚本以配合 Listary 使用 ,总之算是暂时解决了需求, 虽然想到了一些可以加进去的功能,但实在没啥更多动力 :joy:,干脆放出来。

核心功能

  • 上下文感知菜单:为不同应用程序(如 Notepad.exeCode.exe)提供完全独立的路径快捷菜单。
  • 规则按需细化:可根据对话框的窗口标题(如 “打开” 与 “另存为”)进一步区分,展示更精确的路径选项。
  • 动态路径集成:自动抓取并显示当前 Windows 资源管理器、Directory Opus、QTTabBar 中已打开的文件夹路径。(注:未加入 Total Commander 是因为我个人不倾向于使用剪贴板进行交互,不介意的用户可以自行修改实现,可参照坛里这贴FolderMenuList)。
  • 一键路径收集 (“快速添加”):在对话框中定位到目标文件夹后,只需点击菜单中的“快速添加”,即可将当前路径或选中的文件/文件夹路径,智能地添加到配置文件中。(注:此功能依赖 UIA 库,同样是为了避免占用和操作剪贴板)。
  • 无限层级分组:通过简单的文本语法,在菜单中创建任意层级的子菜单(分组),以便清晰、有条理地组织大量路径。

工作原理

当在一个对话框中按下热键时,脚本会通过一个分层匹配逻辑来动态构建菜单:

  1. 匹配进程名 (Process Name):脚本首先通过 WinGetProcessName() 获取当前对话框所属的进程,例如 Photoshop.exe
  2. 匹配窗口标题 (Window Title):接着,通过 WinGetTitle() 获取对话框的标题,例如“另存为…”。此项默认使用正则表达式进行匹配。
  3. 匹配窗口文本 (Window Text):最后,通过 WinGetText() 获取窗口内的其他文本内容,用于更精细的场景判断。此项也默认使用正则表达式。
  4. 查找规则并构建菜单:脚本在其配置文件 DialogSwitch.ini 中,寻找与上述进程、标题、文本规则都匹配的路径条目来生成菜单。
  5. 预留扩展参数ShowContextMenu(*p) 函数预留了可变参数 p*,为未来更复杂的匹配需求提供了扩展可能。

匹配流程:

  • 优先应用最精确的规则(例如,Photoshop.exe另存为)。
  • 如果找不到针对特定窗口标题的规则,则会回退至该程序下的通用规则(例如,Photoshop.exe所有标题)。
  • 如果连当前程序的规则都未定义,则会使用全局规则(所有程序所有标题)。
  • 最后,脚本会将从各类资源管理器中动态获取的路径一并加入到最终菜单中。

这个机制确保了你总能看到一个既包含通用常用路径,又包含当前场景专属路径的最优化菜单。

使用说明

  1. 环境要求

    • Windows 10(Windows 11 的部分控件可能存在差异,或需自行适配)。
    • AutoHotkey v2
    • UIA.ahk 库(仅用于“快速添加”功能,如果不在意剪贴板占用,可自行修改为 Ctrl+C / Ctrl+V 的方式实现)。
  2. 注意事项

    1. 若使用 Directory Opus,必须在 设置选项从任务栏启动 中,关闭 将图标添加到任务栏 选项,否则脚本将无法获取标签页信息。同时,请注意修改脚本中的 dopusRT_Path 变量为 dopusrt.exe 实际路径。
    2. 脚本中的 isPathCollectorEnabled := true 变量用于控制是否在菜单中显示 快速添加 选项。
    3. isSingleGroupExplore := true 变量用于控制是否将所有来自资源管理器的动态路径聚合到一个名为 explorer 的子菜单中。
    4. groupUngroupedItems := false 变量用于控制配置文件中未被明确分组的路径项的显示方式:false 将其直接置于菜单顶层,true 则会将其统一聚合在名为 - 的子菜单下。
  3. 基本操作

    • 打开任意一个标准的“打开”或“保存”对话框(#32770)。
    • 按下热键 LWin (左 Win 键) 或 鼠标中键
    • 此时,上下文快捷菜单便会弹出,点击其中的路径即可快速跳转。
      PixPin_2025-07-18_21-07-23.png

配置文件 (DialogSwitch.ini) 详解

通过托盘菜单的“修改配置”来编辑它,或者使用“快速添加”。

语法规则

  • 注释:以 ; (分号) 开头的行将被忽略。
  • 菜单项
    • 格式为 显示名称|实际路径。例如:我的桌面|C:\Users\Admin\Desktop
    • 如果省略 显示名称|,则路径本身将作为菜单项的显示名称。
  • 变量:脚本支持使用 {1} 来代表当前 Windows 用户名,例如 C:\Users\{1}\Downloads 会被自动解析为 C:\Users\YourUserName\Downloads
上下文与分组规则

通过在行首添加不同数量的 - (减号) 来定义规则的层级和分组:

  • - 进程名定义程序。这是最高层级的规则。

    • 若省略此项直接书写路径,则该路径会被视为 全局规则,对所有程序生效。
  • -- 窗口标题定义窗口标题。此规则从属于上一级的 - 进程名,支持正则表达式。

    • 若省略此项,则规则将匹配该程序下的 所有窗口标题
  • --- 控件文本:定义对话框内特定控件的文本。这是一个不常用的高级选项,通常省略即可。

  • ---- 分组名称定义一级子菜单(分组)

  • ----- 分组名称定义二级子菜单,并可继续增加减号数量来创建更多层级的嵌套。

综合配置示例
; ==================================
; 1. 全局规则 (对所有程序生效)
; ==================================
; 直接写在文件顶部,脚本会自动识别为全局规则
桌面|C:\Users\{1}\Desktop
下载|C:\Users\{1}\Downloads

---- 工作项目
D:\Projects\Project_A
D:\Projects\Project_B

---- 常用工具
----- 开发相关
C:\Program Files\Git
----- 设计素材
E:\Assets\Images

; ==================================
; 2. 针对 VS Code 的特定规则
; ==================================
- Code.exe
---- 前端项目
D:\Work\WebApp\VueProject
D:\Work\WebApp\ReactProject

; 当在 Code.exe 中,且窗口标题匹配“保存工作区”时,显示以下路径
-- 保存工作区
D:\Work\VSCode_Workspaces

; ==================================
; 3. 针对记事本的规则
; ==================================
- Notepad.exe
-- 另存为
C:\Temp\Notes
-- 打开
C:\Users\{1}\Documents
3 个赞

有点意思,体验体验

提升效率的好工具,谢谢

有没有大佬打个exe :grin:

1 个赞

Clip_20250721_104242.png

在使用过程中, 发现有时候会触发这种报错, 大佬能看看是啥问题嘛.

是偶尔出现还是一直?
加了个重试逻辑,会尝试3次读tab,读不到就忽略

加了 :joy:
编译版本

好东西,找时间整合到我自己的 ahk 脚本中

感谢佬友

PixPin_2025-07-21_16-21-07.png
在另存为中点击热键或者鼠标中键都会报错 :joy:

改了一下,不报错的话看看是哪几个资源管理器窗口被跳过了。

win11,dopus中已取消勾选将图标添加到任务栏
PixPin_2025-07-22_16-11-40.png
在另存为中点击热键会在dopus中打开一个不存在的文件夹:
PixPin_2025-07-22_16-14-22.png
同时explorer中没有资源管理器窗口:
PixPin_2025-07-22_16-15-03.png

第一个结果就很奇怪了,
第二个是为了获取Directory Opus标签页

看上去有点像权限问题,还有这个工具是用于win10环境,win11跳转估计也用不了,控件有变化