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

**URL:** <https://meta.appinn.net/t/topic/73400>\
**Category:** 讨论分享\
**Tags:** autohotkey, windows\
**Created:** [2025 年7 月 18 日 13:34 UTC](https://meta.appinn.net/t/topic/73400 "2025-07-18T13:34:21Z")\
**Posts on this page:** 13\
**Page:** 1

<div class="post-metadata">

**Author:** ![Ahy](https://meta-edge.appinn.com/letter_avatar_proxy/v4/letter/a/7cd45c/32.png) [@Ahy](https://meta.appinn.net/u/Ahy)\
**Post date:** [2025 年7 月 18 日 13:34 UTC](https://meta.appinn.net/t/topic/73400/1 "2025-07-18T13:34:21Z")

</div>

### 前言

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

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

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

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

> **[GitHub - Ahykal/DialogSwitch: Path switcher for Windows file dialogs. Provides a...](https://github.com/Ahykal/DialogSwitch)**
>
> Path switcher for Windows file dialogs. Provides a configurable, context-aware popup menu of favorite folders, tailored to the active application and dialog title.

### 核心功能

- **上下文感知菜单** ：为不同应用程序（如 `Notepad.exe` 与 `Code.exe`）提供完全独立的路径快捷菜单。
- **规则按需细化** ：可根据对话框的窗口标题（如 “打开” 与 “另存为”）进一步区分，展示更精确的路径选项。
- **动态路径集成** ：自动抓取并显示当前 Windows 资源管理器、Directory Opus、QTTabBar 中已打开的文件夹路径。（注：未加入 Total Commander 是因为我个人不倾向于使用剪贴板进行交互，不介意的用户可以自行修改实现,可参照坛里这贴[FolderMenuList](https://meta.appinn.net/t/topic/43419)）。
- **一键路径收集 (“快速添加”)**：在对话框中定位到目标文件夹后，只需点击菜单中的“快速添加”，即可将当前路径或选中的文件/文件夹路径，智能地添加到配置文件中。（注：此功能依赖 `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. **环境要求** ：

2. **注意事项**

3. **基本操作** ：

### 配置文件 (`DialogSwitch.ini`) 详解

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

#### 语法规则

- **注释** ：以 `;` (分号) 开头的行将被忽略。
- **菜单项** ：
  - 格式为 `显示名称|实际路径`。例如：`我的桌面|C:\Users\Admin\Desktop`。
  - 如果省略 `显示名称|`，则路径本身将作为菜单项的显示名称。

- **变量** ：脚本支持使用 `{1}` 来代表当前 Windows 用户名，例如 `C:\Users\{1}\Downloads` 会被自动解析为 `C:\Users\YourUserName\Downloads`。

##### 上下文与分组规则

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

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

- `-- 窗口标题`： **定义窗口标题** 。此规则从属于上一级的 `- 进程名`，支持正则表达式。

- `--- 控件文本`：定义对话框内特定控件的文本。这是一个不常用的高级选项，通常省略即可。

- `---- 分组名称`： **定义一级子菜单（分组）** 。

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

##### 综合配置示例

```ini
; ==================================
; 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

```

---

<div class="post-metadata">

**Author:** ![CCR](https://meta-edge.appinn.com/user_avatar/meta.appinn.net/ccr/32/68442_2.png) [@CCR](https://meta.appinn.net/u/CCR)\
**Post date:** [2025 年7 月 18 日 13:36 UTC](https://meta.appinn.net/t/topic/73400/2 "2025-07-18T13:36:12Z")

</div>

有点意思，体验体验

---

<div class="post-metadata">

**Author:** ![apping](https://meta-edge.appinn.com/letter_avatar_proxy/v4/letter/a/91b2a8/32.png) [@apping](https://meta.appinn.net/u/apping)\
**Post date:** [2025 年7 月 20 日 12:13 UTC](https://meta.appinn.net/t/topic/73400/3 "2025-07-20T12:13:36Z")

</div>

提升效率的好工具，谢谢

---

<div class="post-metadata">

**Author:** ![eman](https://meta-edge.appinn.com/letter_avatar_proxy/v4/letter/e/94ad74/32.png) [@eman](https://meta.appinn.net/u/eman)\
**Post date:** [2025 年7 月 21 日 02:28 UTC](https://meta.appinn.net/t/topic/73400/4 "2025-07-21T02:28:52Z")

</div>

有没有大佬打个exe :grin:

---

<div class="post-metadata">

**Author:** ![zjmwlp](https://meta-edge.appinn.com/letter_avatar_proxy/v4/letter/z/977dab/32.png) [@zjmwlp](https://meta.appinn.net/u/zjmwlp)\
**Post date:** [2025 年7 月 21 日 02:44 UTC](https://meta.appinn.net/t/topic/73400/5 "2025-07-21T02:44:07Z")

</div>

![Clip_20250721_104242.png](https://h1.appinn.me/file/1753065813097_Clip_20250721_104242.png)

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

---

<div class="post-metadata">

**Author:** ![Ahy](https://meta-edge.appinn.com/letter_avatar_proxy/v4/letter/a/7cd45c/32.png) [@Ahy](https://meta.appinn.net/u/Ahy)\
**Post date:** [2025 年7 月 21 日 04:17 UTC](https://meta.appinn.net/t/topic/73400/6 "2025-07-21T04:17:13Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![Ahy](https://meta-edge.appinn.com/letter_avatar_proxy/v4/letter/a/7cd45c/32.png) [@Ahy](https://meta.appinn.net/u/Ahy)\
**Post date:** [2025 年7 月 21 日 06:55 UTC](https://meta.appinn.net/t/topic/73400/7 "2025-07-21T06:55:17Z")

</div>

加了 :joy:  
[编译版本](https://github.com/Ahykal/DialogSwitch/releases/download/1.0.2/DialogSwitch.exe)

---

<div class="post-metadata">

**Author:** ![Hue](https://meta-edge.appinn.com/user_avatar/meta.appinn.net/hue/32/10282_2.png) [@Hue](https://meta.appinn.net/u/Hue)\
**Post date:** [2025 年7 月 21 日 06:58 UTC](https://meta.appinn.net/t/topic/73400/8 "2025-07-21T06:58:13Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![eman](https://meta-edge.appinn.com/letter_avatar_proxy/v4/letter/e/94ad74/32.png) [@eman](https://meta.appinn.net/u/eman)\
**Post date:** [2025 年7 月 21 日 07:20 UTC](https://meta.appinn.net/t/topic/73400/9 "2025-07-21T07:20:53Z")

</div>

感谢佬友

---

<div class="post-metadata">

**Author:** ![eman](https://meta-edge.appinn.com/letter_avatar_proxy/v4/letter/e/94ad74/32.png) [@eman](https://meta.appinn.net/u/eman)\
**Post date:** [2025 年7 月 21 日 08:26 UTC](https://meta.appinn.net/t/topic/73400/10 "2025-07-21T08:26:16Z")

</div>

![PixPin_2025-07-21_16-21-07.png](https://h1.appinn.me/file/1753086221974_PixPin_2025-07-21_16-21-07.png)  
在另存为中点击热键或者鼠标中键都会报错 :joy:

---

<div class="post-metadata">

**Author:** ![Ahy](https://meta-edge.appinn.com/letter_avatar_proxy/v4/letter/a/7cd45c/32.png) [@Ahy](https://meta.appinn.net/u/Ahy)\
**Post date:** [2025 年7 月 21 日 09:49 UTC](https://meta.appinn.net/t/topic/73400/11 "2025-07-21T09:49:18Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![eman](https://meta-edge.appinn.com/letter_avatar_proxy/v4/letter/e/94ad74/32.png) [@eman](https://meta.appinn.net/u/eman)\
**Post date:** [2025 年7 月 22 日 08:16 UTC](https://meta.appinn.net/t/topic/73400/12 "2025-07-22T08:16:56Z")

</div>

win11,dopus中已取消勾选将图标添加到任务栏  
 ![PixPin_2025-07-22_16-11-40.png](https://h1.appinn.me/file/1753171940312_PixPin_2025-07-22_16-11-40.png)  
在另存为中点击热键会在dopus中打开一个不存在的文件夹：  
 ![PixPin_2025-07-22_16-14-22.png](https://h1.appinn.me/file/1753172079403_PixPin_2025-07-22_16-14-22.png)  
同时explorer中没有资源管理器窗口：  
 ![PixPin_2025-07-22_16-15-03.png](https://h1.appinn.me/file/1753172114949_PixPin_2025-07-22_16-15-03.png)

---

<div class="post-metadata">

**Author:** ![Ahy](https://meta-edge.appinn.com/letter_avatar_proxy/v4/letter/a/7cd45c/32.png) [@Ahy](https://meta.appinn.net/u/Ahy)\
**Post date:** [2025 年7 月 24 日 08:56 UTC](https://meta.appinn.net/t/topic/73400/13 "2025-07-24T08:56:35Z")

</div>

第一个结果就很奇怪了,  
第二个是为了获取Directory Opus标签页  
[![](https://h1.appinn.me/file/1753347236816_PixPin_2025-07-24_16-52-07.png) ](https://h1.appinn.me/file/1753347236816_PixPin_2025-07-24_16-52-07.png)  
看上去有点像权限问题，还有这个工具是用于win10环境，win11跳转估计也用不了，控件有变化
