- 通信
- 网络
【免费下载链接】KiTTY
:computer: KiTTY, a free telnet/ssh client for Windows
导读:KiTTY 的 Session Launcher(会话启动器)是一个常驻系统托盘的独立工具,用于替代 Pageant 中"启动已保存会话"的能力——它把所有已保存会话按文件夹组织成多级菜单与子菜单,让你无需打开主界面即可一键发起 SSH/Telnet 连接。本文以 docs/pages/SessionLauncher.md 为主线,结合 kitty_launcher.c、kitty.c 等源码,完整讲解 Launcher 的启动方式、菜单组织规则、注册表存储机制、
kitty.ini配置项以及"Opened sessions"窗口隐藏/显示功能,读完即可在 Windows 上配置出一个符合自己习惯的会话启动器。
一、Session Launcher 是什么?为什么需要它
在经典 PuTTY 体系(KiTTY 的上游)中,Pageant(SSH 密钥代理)的右键菜单里集成了"启动已保存会话"的能力,但该功能没有独立的菜单或子菜单,在会话数量较多时既不直观也不易分类。
KiTTY 因此单独集成了一款launcher(会话启动器):它以托盘图标常驻,右键/左键点开后呈现一棵完整的会话菜单树,支持按文件夹无限层级展开,使用体验类似于"应用启动器"。
从源码结构看,该功能由编译宏MOD_LAUNCHER控制,完整实现在 kitty_launcher.c,编译开关位于 0.76_My_PuTTY/windows/MAKEFILE.MINGW(-DMOD_LAUNCHER)。也就是说,如果某个 KiTTY 构建未启用该宏,-launcher参数不会生效——这是判断"为什么我的 launcher 没反应"时首先要检查的一点。
二、启动方式:命令行-launcher参数
文档给出的启动方式非常直接——在命令行运行:
kitty.exe -launcher该参数在 0.76_My_PuTTY/windows/window.c 中被解析:当命令行参数与-launcher匹配时,程序直接转入Launcher_WinMain并启动启动器流程(该函数声明在 kitty_launcher.h):
} else if( !strcmp(p, "-launcher") ) { char *np; np=strstr(cmdline,"-launcher")+9; return Launcher_WinMain(inst, prev, np, show) ; }实用提示:
- 该参数也收录在 docs/pages/CommandLine.md 的新增命令行选项清单中;
- 可以把它做成桌面快捷方式(
目标填kitty.exe -launcher),或放进"启动"文件夹实现开机自启,随时从托盘取用。
三、启动后的界面:托盘图标与菜单
软件启动后不会弹出主窗口,而是以新图标常驻系统托盘,图标外观如下(来源:docs/img/kitty_launcher.ico):
图标交互逻辑在Launcher_WndProc(kitty_launcher.c)中实现,具体为:
- 左键单击(WM_LBUTTONUP):刷新并弹出完整的会话菜单树(
MenuLauncher); - 右键单击(WM_RBUTTONUP):刷新并弹出"Opened sessions"窗口管理菜单(
HideMenu); - 图标通过
Shell_NotifyIcon(NIM_ADD, ...)注册,并监听TaskbarCreated消息——Explorer 崩溃重启后托盘图标会自动恢复(kitty_launcher.c)。
菜单实际展开后的效果如文档示例图所示,菜单中既包含按文件夹组织的会话层级,也包含"Opened sessions"、Refresh、Configuration、TTY-ed、About、Quit 等功能项(kitty_launcher.c):
KiTTY Launcher 菜单示例
四、菜单的组织:文件夹与\分隔符
Launcher 的菜单树直接对应 KiTTY 的会话文件夹(folders)机制。也就是说,如果你在 KiTTY 主配置界面里把大量会话分门别类放进不同文件夹(例如按机器、按环境、按应用各建一个文件夹),Launcher 会自动把每个文件夹渲染成一个子菜单。
关键规则:子菜单的路径分隔符是反斜杠\。例如文件夹层级生产环境\华东\web-01会呈现为三级子菜单。有关文件夹的创建与过滤管理,参见 docs/pages/SessionsFilter.md(该文档还介绍了通过"Saved Session/New Folder"输入框按会话名或主机名过滤的filter=yes配置)。
菜单树的递归构建逻辑位于 kitty.c 的ReadSpecialMenu:
- 注册表/INI 文件模式(SAVEMODE_REG / SAVEMODE_FILE):遍历注册表子键,每个子键递归生成一个
MF_POPUP子菜单; - 目录模式(SAVEMODE_DIR):遍历
ConfigDirectory下的目录树,目录对应子菜单、文件对应菜单项; - 菜单项上限为
NB_MENU_MAX(1024 个,见 kitty.c); - 在 Launcher 菜单中,"Default Settings"(默认设置)会话被显式过滤掉,不会出现在菜单里(kitty.c)。
若启用了快捷键(ShortcutsFlag),前 26 个会话还会自动附加Ctrl+Shift+A~Ctrl+Shift+Z的快捷键提示(kitty.c)。
五、菜单数据的存储位置:注册表Launcher键
文档明确给出菜单树保存在注册表键:
[HKEY_CURRENT_USER\Software\9bis.com\KiTTY\Launcher]该键的结构与HKEY_CURRENT_USER\Software\9bis.com\KiTTY\Sessions下的会话一一对应:每个文件夹对应一个子键,每个会话对应一个值(值名即会话名,值为会话标识)。目录模式(savemode=dir)下则对应ConfigDirectory\Launcher目录树,其中每个会话对应一个文本文件(内容形如会话名\文件夹\,见 kitty_launcher.c 的写入逻辑)。
默认行为:每次启动自动重建
默认情况下,Launcher 每次启动时都会从已保存的会话重新生成(重建)这个菜单树。这一逻辑在Launcher_WinMain中体现为:
if( LauncherConfReload ) InitLauncherRegistry() ; // [kitty_launcher.c](https://link.gitcode.com/i/31d646eddff99d6acede0bbec031df92#L705)InitLauncherRegistry(kitty_launcher.c)会先删除旧的Launcher键/目录,再遍历Sessions键/目录,把每个会话按Folder值归类后重新写入。其好处是:你在主界面新增、改名或删除会话后,Launcher 菜单永远与当前会话列表保持同步,无需手动维护。该函数在 KiTTY 主程序启动时也会被调用以做初始化(kitty.c)。
自定义菜单:关闭自动重载
如果你希望完全手工组织Launcher 菜单(例如在注册表里自定义子键结构、改名、加分隔),可以关闭自动重载。方法是编辑kitty.ini配置文件,加入:
[Launcher] reload=no配置项模板可在 kitty_ini.txt 中查看(默认值为reload=yes)。对应源码读取逻辑为 kitty_launcher.c:
if( ReadParameter( "Launcher", "reload", buffer ) ) { if( !stricmp( buffer, "NO" ) ) LauncherConfReload = 0 ; }关闭后,你可以直接用注册表编辑器(regedit)修改HKEY_CURRENT_USER\Software\9bis.com\KiTTY\Launcher下的键结构来定制菜单布局;之后每次Refresh(菜单中的 Refresh 项,即IDM_LAUNCHER+7)不会再覆盖你的手工调整——注意Refresh与"自动重载"的耦合点:当LauncherConfReload为 0 时,刷新仅重建菜单而不重建注册表键(kitty_launcher.c)。
六、[Launcher]节的其他可选配置项
除文档提到的reload外,源码中还支持以下同节配置,均可写入 kitty.ini 的[Launcher]节:
| 配置项 | 默认行为 | 作用 | 源码位置 |
|---|---|---|---|
reload | yes | 设为no时禁止每次启动从已保存会话重建菜单树,改为手工维护注册表键 | kitty_launcher.c |
classname | KiTTYLauncher | 自定义 Launcher 窗口类名,可用于与其他窗口实例区分或配合-sendcmd等按类名广播的功能 | kitty_launcher.c |
alreadyRunCheck | yes(未配置时视为 yes) | 设为no时允许多个 Launcher 实例同时运行;默认检测到同名窗口类已存在则直接退出 | kitty_launcher.c |
说明:
classname与alreadyRunCheck未在原始文档中列出,但从 kitty_launcher.c 的实现可以确认其存在与语义,属于同一配置节的有效选项。
七、Opened sessions:隐藏/显示正在运行的会话
Launcher 内置一个Opened sessions菜单,专门用于管理当前正在运行的 KiTTY 会话窗口。它的核心能力是:把某个(或全部)会话窗口从桌面和任务栏上完全隐藏,需要时再恢复显示——非常适合同时开启大量 SSH 会话、桌面空间紧张,或需要把长驻隧道/监控窗口收起来只留托盘图标的场景。
菜单功能项
在 kitty_launcher.c 中可以看到该菜单的组成:
- Hide all / Unhide all:一键隐藏或恢复全部 KiTTY 窗口;
- Window unique:切换"单窗口模式"——开启后同一时刻仅允许一个会话窗口可见,切换会话时自动隐藏其余窗口;
- 每个运行中的 KiTTY 窗口一项(按窗口标题列出,前 100 个,
TabWin[100]),并带复选框标记当前可见/隐藏状态,点击即可单独切换该窗口的显隐。
底层实现
窗口枚举通过EnumWindows+ 类名匹配(KiTTYClassName)实现(kitty_launcher.c),隐藏/显示动作则是向目标窗口发送WM_COMMAND:
void ManageHideOne( HWND hwnd ) { PostMessage( hwnd, WM_COMMAND, IDM_HIDE, 0 ) ; } void ManageUnHideOne( HWND hwnd ) { PostMessage( hwnd, WM_COMMAND, IDM_UNHIDE, 0 ) ; }其中IDM_HIDE/IDM_UNHIDE/IDM_SWITCH_HIDE等命令 ID 定义于 kitty.h(0xA960/0xA970/0xA980)。这些消息最终由各个 KiTTY 会话窗口自己处理,从而做到从桌面与任务栏完全消失。
使用注意
- 隐藏后的会话仍然在运行(连接不断),只是不可见;退出 Launcher(
Quit)时会自动执行ManageUnHideAll恢复所有窗口(kitty_launcher.c); - 窗口列表基于类名匹配,因此若通过
-classname自定义了窗口类名,需保证 Launcher 与目标窗口使用一致的类名才能被识别。
八、点击会话后的执行流程:从菜单项到新连接
当你在菜单中点击某个会话项时,WM_COMMAND分支(kitty_launcher.c)会调用RunSession,其核心逻辑(kitty_launcher.c)如下:
- 通过
GetModuleFileName+GetShortPathName取得 kitty.exe 的短路径名; - 若是注册表模式,把会话名
mungestr编码后拼接为Sessions\<会话>键路径,校验会话是否存在; - 构造命令行并交给
RunCommand启动新进程:- 普通会话:
kitty.exe -load "会话名"; - 会话名以
&结尾(KiTTY 的"启动即最小化到托盘"约定):追加-send-to-tray,即kitty.exe -load "会话名" -send-to-tray(适合 SSH 隧道等后台型连接); - 若带
-putty标志(兼容模式),则在命令前加-putty以关闭 KiTTY 扩展特性。
- 普通会话:
目录模式(savemode=dir+ 文件夹浏览)下还会为带文件夹的会话附加-folder "文件夹名"参数(kitty_launcher.c),与 docs/pages/CommandLine.md 中-folder(必须位于-load之前)的说明互相印证。
九、典型使用场景小结
结合文档与源码,Session Launcher 最常见的几种用法是:
- 高频会话启动器:把
kitty.exe -launcher加入开机自启,任何时刻左键点托盘图标即可在文件夹菜单中发起连接,免去打开主界面再翻找会话的步骤; - 多会话桌面整理:同时维护大量监控/运维窗口时,用Opened sessions的 Hide all 把窗口全部收起,需要哪个再单独恢复,或开启Window unique保持同一时刻只有一个会话窗口可见;
- 后台隧道专用入口:把会话名以
&结尾命名(如tunnel-prod&),从 Launcher 点击后自动以-send-to-tray方式在后台建立 SSH 隧道,不打扰当前工作; - 团队共享菜单:关闭
reload=no后手工维护注册表中的Launcher键,把菜单整理成团队约定的固定结构,再通过导出注册表键分发给同事。
十、常见问题排查
| 现象 | 可能原因与解决办法 |
|---|---|
kitty.exe -launcher无反应 | 当前构建未启用MOD_LAUNCHER宏(编译参数见 0.76_My_PuTTY/windows/MAKEFILE.MINGW),需使用完整功能的 KiTTY 版本 |
| 菜单里没有已保存会话 | Launcher 从Sessions键重建菜单,确认会话确实保存在HKEY_CURRENT_USER\Software\9bis.com\KiTTY\Sessions(或目录模式下的Sessions目录),并检查[Launcher] reload未被设为no |
| 手工改的注册表菜单被覆盖 | reload=no未设置;补上该配置并重启 Launcher 后,Refresh不会再重建注册表键 |
| 隐藏的窗口找不回来了 | 在Opened sessions菜单中点击对应窗口项(Unhide)或选择Unhide all;正常退出 Launcher 也会自动恢复全部窗口 |
| 托盘图标消失 | 若 Explorer 崩溃,Launcher 监听了TaskbarCreated会自动重建图标;若未恢复,可重新运行kitty.exe -launcher |
延伸阅读:文件夹机制详见 docs/pages/SessionsFilter.md;-launcher与其他命令行选项的完整清单见 docs/pages/CommandLine.md;Launcher 全部源码实现见 kitty_launcher.c,菜单递归构建逻辑见 kitty.c。
- 通信
- 网络
【免费下载链接】KiTTY
:computer: KiTTY, a free telnet/ssh client for Windows
相关推荐
AionUi ACP 单聊会话管理(F-SESSION)实战指南:从会话创建到生命周期守护的完整实现解析
AionUi ACP 单聊会话管理(F SESSION)实战指南:从会话创建到生命周期守护的完整实现解析 导读 本文基于 AionUi 开源仓库中的 ACP 单
人工智能AI 应用AI Agent交互助手桌面应用移动开发QOwnNotes 命令行参数完全指南:用 CLI 控制启动、会话、解密与菜单动作
QOwnNotes 命令行参数完全指南:用 CLI 控制启动、会话、解密与菜单动作 QOwnNotes 是一款支持 Markdown 与 Nextcloud /
桌面应用H3 会话(Session)实战指南:基于 Cookie 的加密会话管理全解析
H3 会话(Session)实战指南:基于 Cookie 的加密会话管理全解析 H3 内置的 useSession / getSession / updateS
后端Web框架
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考