G
YouTube TikTok Games
Skip to content

About

menubarX for windows

Topics

Resources

Stars

506 stars

Watchers

3 watching

Forks

Latest commit

 

History

66 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

TrayChrome - 托盘浏览器

一个基于 WPF 和 WebView2 的轻量级托盘浏览器,专为 Windows 设计。类似 MenubarX,但更加轻便和功能丰富。 这里是一些建议网站,适合traychrome

image

左键拖拽,右键调整大小。 PixPin_2025-09-16_00-23-42

你也可以多开实例。 PixPin_2025-09-16_00-24-16

一个实用场景举例:快捷使用 icoud 提醒事项 image

✨ 主要特性

  • 🎯 托盘集成:最小化到系统托盘,不占用任务栏空间
  • 📱 移动优先:默认使用移动端 User-Agent,适合移动版网站
  • 🎨 超级极简模式:隐藏工具栏,纯净浏览体验
  • Alt 拖动:极简模式下按住 Alt 并左键拖动网页即可移动窗口,不会触发网页点击
  • App 组:保存所有实例的 URL、图标和窗口尺寸,在独立的 App 组管理窗口或托盘右键菜单中切换多组 JSON 文件
  • 🐒 油猴脚本:内置轻量脚本引擎,支持常见 Tampermonkey / Greasemonkey 用户脚本(见下方「油猴脚本」)
  • 🔍 页内查找:Ctrl+F 查找当前网页文字
  • 🔄 多实例支持:可同时运行多个独立的浏览器实例
  • 实例内多标签页:同一窗口内新增、切换和关闭网页,共用一个托盘图标和实例快捷键。
  • 🌙 暗色模式:支持网页暗色模式切换
  • 📌 窗口置顶:可设置窗口始终保持在最前面
  • ⭐ 收藏夹管理:本地收藏夹存储和管理
  • 🔑 Basic Auth 自动登录:需要 HTTP Basic 认证的站点弹出登录框,勾选「记住」后按站点(协议+主机+端口)保存到 basic-auth.json,密码用当前 Windows 用户的 DPAPI 加密,下次自动登录;保存的密码失效时会重新弹框。网页右键「Tray Chrome 选项 → 清除本站保存的登录」可删除。basic-auth.json 只能由同一 Windows 用户解密,不能拷到其他电脑使用。
  • 📢 去广告功能:简单的自定义去广告规则,支持 ||域名^、|开头、*、^ 等 AdBlock 语法;/.../ 仅在含正则元字符时视为正则,/ads/ 按路径字面匹配,不会误拦 uploads 等图片。

用法

双击启动,ctrl+中键开启新窗口,中键托盘图标退出。

托盘右键菜单使用竖向菜单项,包含增加实例、重启实例和关闭实例。

快捷键说明

快捷键 功能
全局快捷键(默认 Alt + X,App 组可单独设置) 窗口已收起时召唤出来;未收起但被其他程序窗口挡住时提到最上层;未收起且在最上层时收起
中键(tray icon) 关闭 TrayChrome 实例
Ctrl + 中键(tray icon) 关闭当前实例
Ctrl + Shift + L 聚焦到地址栏(极简模式会先显示工具栏)
Ctrl + R 刷新当前页面
Ctrl +Shift + O 书签
Ctrl +Shift + B 切换极简模式(Clean 模式),也可在网页右键菜单根目录切换
Ctrl + 点击链接 在当前实例的新标签页打开
Ctrl + T 新建标签页
Ctrl + W 关闭当前标签页;只剩一页时隐藏窗口到托盘
Ctrl + Tab / Ctrl + Shift + Tab 切换到下一页 / 上一页
Ctrl + Shift + 点击链接 用系统默认浏览器打开 HTTP/HTTPS 链接
Alt + 左键拖动 极简模式下移动窗口,不点击网页

置顶按钮使用固定的单色图形,蓝色表示置顶,灰色表示未置顶。

标签栏仅在有多个标签页且非极简模式时显示,只有一页时自动隐藏,按 Ctrl+T 新增后展开。+ 只显示在展开的标签栏内,窗口关闭按钮旁不再显示。标签采用无边框纯文本,以 | 分隔;底色与上方工具栏一致,当前页仅通过字重和文字明暗区分,不使用反色块、亮边框或蓝色高亮。标签可左键拖动排序(重启和 App 组按新顺序保存)。Ctrl+Tab 按住期间只切换一次,松开后可再次切换。Ctrl+T 或 + 新建标签页后自动聚焦地址栏并全选(极简模式会先退出),页面加载不会覆盖正在输入的内容。中键点击标签关闭,右键可关闭当前页、用新窗口打开(启动一个新实例并显示,沿用当前图标、尺寸和极简模式,不继承快捷键,原标签保留)、关闭其他页、右侧页或刷新,不显示单独的关闭按钮。每页保留各自的网页、导航历史和滚动状态;地址栏与导航按钮操作当前页。缩放按网站记忆;UA、广告规则、窗口尺寸和实例快捷键为实例级设置。极简模式隐藏标签栏,但仍可使用上述快捷键;Ctrl+Shift+L 可退出极简模式并聚焦地址栏。普通弹出链接保持在当前页打开,Ctrl+Shift+点击仍使用系统默认浏览器。

参数说明

.\TrayChrome.exe [参数]
参数 功能 示例
--url <网址> 指定启动时加载的网页 --url "https://www.google.com"
--tab <网址> 在同一实例中追加标签页,可重复指定 --tab "https://example.com"
--open 启动时直接显示窗口 --open
--clean 启用超级极简模式(隐藏工具栏) --clean
--unclean 强制禁用超级极简模式 --unclean
--help 或 -h 显示帮助信息 --help
--size <宽度x高度> 指定窗口大小 --size 800x600
--icon <图标路径> 指定当前实例的 PNG/ICO 图标,不修改默认图标 --icon "C:\Icons\app.png"
--app-group <组文件路径> 打开组内全部 App,保留原有实例,不额外创建空白实例 --app-group "C:\Groups\work.json"

参数使用示例

# 启动极简模式jandan.net
.\TrayChrome.exe --url "https://jandan.net" --open --clean

# 强制禁用极简模式启动
.\TrayChrome.exe --unclean

# 显示帮助信息
.\TrayChrome.exe --help

# 直接打开网页并显示窗口
.\TrayChrome.exe --url "https://www.baidu.com" --open

🎮 界面功能详解

顶部工具栏

初始化控制器断连时更换控件并重新初始化一次。失败仍会明确报错并撤销新标签,保留原有标签;这不等同于完整的浏览器进程崩溃恢复。

Ctrl+Shift+T 按最近关闭顺序恢复当前实例的标签页,可连续使用;重新打开网址,不恢复表单和滚动位置。仅保留本次运行中关闭的标签,最后一页隐藏窗口不计入关闭记录。

鼠标在标签栏上滚轮可切换标签:向上为前一个,向下为后一个,首尾循环;最多每 150 毫秒切换一次,过密事件丢弃而不排队,不影响网页区域的滚动。

元素 功能 操作方式
☰ 汉堡菜单 窗口拖拽和调整 左键拖拽移动窗口
右键拖拽调整窗口大小
搜索 页内查找 汉堡菜单右侧放大镜,同 Ctrl+F
地址栏 网址输入和显示 输入网址后按 Enter 导航
× 关闭按钮 隐藏窗口到托盘 左键点击

底部功能按钮栏

齿轮按钮可打开设置(同 Ctrl+Shift+,),也可通过外观设置收进「…」。所有底栏功能都收进菜单时,底栏整行折叠,「…」显示在顶部 × 左侧;恢复任一底栏项目后恢复底栏。极简模式仍隐藏上下工具栏。

布局设置中的「恢复默认底栏」可重置为出厂布局,点击「应用」或「确定」后生效;不会重置其他设置。

「全部勾选」将全部功能放到底栏,应用后隐藏「…」且不保留空位。底栏置顶、链接、设置、主题、UA 和代理使用统一小尺寸矢量图标;主题在月亮/太阳间切换,UA 在手机竖框/显示器间切换,代理开启时圆圈为蓝色,关闭时恢复主题默认色。

「隐藏底部栏(清空选择)」可一键取消全部底栏选项,应用后收起底栏并将「…」移至顶部。设置、书签管理、App 组管理及其编辑窗口共用明暗主题,切换实例主题时已打开的窗口也会同步;系统消息框及文件选择器仍使用 Windows 自身主题。

「设置 → 外观设置 → 底栏与更多菜单」可自定义后退、前进、刷新、收藏、置顶、缩放、代理、默认浏览器打开、UA、黑白模式及设置的位置:勾选放在底栏,未勾选收进「…」。点击应用后生效并保存,重启保留;搜索固定在左上角。出厂底栏为后退、前进、刷新、收藏、历史、置顶、缩放放大镜、设置及「…」。

按钮 图标 功能 说明
后退 ‹ 返回上一页 浏览历史后退
前进 › 前往下一页 浏览历史前进
刷新 ⟳ 重新加载页面 刷新当前网页
收藏夹 ★ 收藏夹管理 点击显示收藏夹菜单
暗色模式 ☾/☼ 切换网页暗色模式 在暗色和亮色模式间切换
默认浏览器打开 ↗ 在默认浏览器打开 在系统默认浏览器中打开当前页面
用户代理 UA 切换 UA 在移动端和桌面端 User-Agent 间切换

桌面 UA 使用当前 WebView2 Runtime 的原生 UA,不再固定为 Chrome 120;手机 UA 仍用于移动版页面兼容。登录 X/Twitter 等网站时建议先选择「桌面设备 (PC)」并刷新。自动内存回收不会删除 Cookie、网站存储或按内存阈值重建页面,避免打断登录流程。网站提示「临时限制登录」也可能来自账号、IP 或服务端风控,这些兼容性修正不保证解除限制;请避免连续重试,并使用同网络的普通浏览器对照。 | 置顶 | 斜大头钉 | 窗口置顶 | 蓝色置顶,未置顶与其他按钮同色 | | 缩放 | 内带加号的放大镜 | 调整页面缩放 | 悬停显示比例,点击展开加减及百分比输入框,120 表示 120% | | 代理 | ◎ | 代理管理 | 开关、设置及重启操作 | | 拖拽 | | 拖拽移动 | 拖拽移动窗口位置 | | 调整 | | 调整大小 | 拖拽调整窗口大小 |

全局访问历史

历史按钮(小钟表)打开所有实例共享的历史窗口,可按标题或网址搜索、打开及一键清空(需确认)。仅记录成功访问的 HTTP/HTTPS 页面,不记录内置起始页或 about:blank。历史保存在程序目录 history.json,保留最近 7 天,读写时清理过期记录;同一目录下各实例通过进程锁及原子写入共享。旧的自定义底栏布局保持不变,可在布局选项勾选「历史记录」,或从「…」进入;恢复默认底栏会显示历史按钮。

收藏夹功能

独立书签管理器在目录树右上角提供「全部折叠」,会收起全部文件夹及子文件夹。顶部目录下拉框用于定位:选择后展开路径、选中并滚动到目标文件夹,选择「全部书签」回到树顶部。树中选中书签按 Enter 在浏览器当前页打开,选中文件夹按 Enter 展开并定位;Del 或右键删除不再确认。新增、编辑、移动(包括拖拽)、删除及导入后保留折叠状态、仍存在的选中项、滚动位置和当前筛选。

通过 Enter、双击或右键打开书签 URL 后,浏览器会恢复显示并激活到前方、聚焦网页;已经显示的窗口也会激活,不改变置顶设置。打开文件夹只在管理器内定位。

搜索框同时筛选名称与 URL,不区分大小写;输入时不刷新树,点击「搜索」或在搜索框按 Enter 才执行。保留匹配项的祖先文件夹并展开路径;清空输入后再执行搜索恢复完整树,不修改存储数据。搜索时的导出仍导出全部书签;通过目录下拉框定位会清空并取消搜索,避免目标被筛选隐藏。

  • 书签菜单、书签右键编辑菜单与标签右键菜单采用同一套紧凑样式,背景、文字和分隔线跟随窗口主题,不显示默认的图标侧栏;切换主题后下次打开立即使用新配色。
  • 添加收藏:浏览器小菜单的「添加到收藏夹」保存当前页面;书签管理器的「添加收藏」打开空白编辑窗口,自行填写标题和 HTTP/HTTPS URL,确认后保存到当前目录。
  • 管理收藏:从星形按钮菜单、托盘「书签管理器」或「设置 → 收藏夹 → 打开书签管理器」进入独立非模态窗口;每个实例只打开一个管理器,重复打开会激活已有窗口并恢复最小化状态。管理器不依附浏览器置顶,管理、编辑或移动书签时仍可使用浏览器。编辑/移动窗口同一时间只开一个,期间仅禁用管理器自身;关闭后恢复。浏览器/托盘更新书签时会关闭未保存的编辑窗口并刷新管理器,避免保存过期条目。树中只显示标题与 URL,不显示行内按钮;右键所在项会先选中,菜单提供打开、编辑、移动和删除。「打开」会在当前标签页导航,文件夹则展开;树获得焦点时可按 Del 删除选中项,不弹确认,保存失败会恢复该项。「打开配置文件」仅位于管理器,星形按钮菜单不再提供 JSON 编辑入口。
  • 树状文件夹管理:树中展开/折叠文件夹,逐行编辑、移动和删除。拖动书签或文件夹到目标文件夹中即可移入,放在普通书签上则移入该书签所属目录,放在树的空白处移回根目录;拖拽不会改变同一目录内顺序。按钮点击不会触发拖拽,不允许移入自身或后代。选中文件夹或使用上方下拉框确定新增/导入目录。删除文件夹会直接连同内容删除,不弹确认。
  • 导入浏览器书签:从「导入 / 导出 → 导入浏览器书签」进入。先在 Chrome、Edge、Firefox 等浏览器中导出 HTML,再导入。保留嵌套文件夹并合并到当前目录,不覆盖已有收藏;重复导入会追加。不支持的地址(如 chrome://、javascript:)及无效地址会跳过,完成后汇总导入和跳过数量,不影响有效条目。文件读取或格式错误仍会提示。
  • 导出到 Chrome:点击「导入 / 导出 → 导出 HTML」导出整个书签树(不是仅选中的文件夹),在 Chrome 的书签管理器中通过「导入书签」读取此文件;保留中文、文件夹及 URL。
  • 配置格式:窗口、托盘和管理器统一使用程序目录中的 Bookmarks.chrome.json,采用 Chrome Bookmarks 的 version / roots / type / name / url / children 结构。旧 bookmarks.json 保留但不自动迁移或继续读取;这是 TrayChrome 自己的文件,不会改写本机 Chrome 配置。与浏览器交换书签请使用 HTML 导入/导出,不要运行中直接覆盖 Chrome 的内部文件。
  • 快速访问:收藏夹菜单中直接点击网站名称

加载提示

Ctrl+Shift+, 打开设置,Ctrl+, 留给网页。「浏览器设置 → 首页」可选内置起始页、纯空白页(about:blank)或自定义 HTTP/HTTPS 网址;普通实例启动和 Ctrl+T 使用首页,命令行和 App 组的显式网址优先。内置起始页离线可用,支持 Google、Bing、百度、DuckDuckGo 搜索,输入网址直接前往,并提供项目 GitHub 链接;搜索和打开网站仍需要网络。

Ctrl+T 创建新标签时若 WebView2 连接断开(RPC_E_DISCONNECTED),程序会记录错误,替换失败控件并重新初始化一次;仍失败会提示错误、撤销新标签并返回原标签。这不代表已有崩溃网页会自动恢复。

加载提示位于网页底部,加载时占 24 像素,极简模式下也可见;完成后整行折叠,空间归还网页,不保留空白。不隐藏 WebView2,也不影响网页绘制。

缩放按网站主机名记忆(不同子域名独立,同主机名的路径、HTTP/HTTPS 和端口共用),保存于程序目录 site-zoom.json,同目录下所有实例共享并在重启后保留。设置页与底栏调整当前网站,同实例中已打开的同网站标签同步,不影响其他网站;其他实例在导航、切换标签或重新激活窗口时读取最新比例。无网站记录时沿用原设置的默认比例(出厂 0.8),about:blank 的临时缩放不写入网站记录。

网站缩放在控件注册及导航开始时设置。WebView2 中仍观察到新文档首帧暂时使用 100% 的情况,提前设置不能完全消除这一现象。

后台启动的组实例即使已经加载完网页,首次召唤时仍显示「正在显示网页…」,直到浏览器返回绘制帧确认;已经显示过的页面再次召唤或切回标签页时直接恢复,不重复显示提示。新导航仍显示加载状态。网络等待超过 5 秒显示「网站响应较慢,仍在等待…」,等待绘制时则显示对应提示。帧确认表示浏览器获得了绘制机会,不保证网站自身的异步内容已全部完成。

页内查找

按 Ctrl+F 在网页上方打开查找栏(查找栏占一行,不遮挡网页;若网页中已选中单行文字会自动填入)。输入即查找,不区分大小写,并高亮全部结果,右侧显示「第几个/共几个」。Enter 或 F3 跳到下一个,Shift+Enter 或 Shift+F3 跳到上一个,Esc 关闭。切换标签页时会在新页面上继续查找。

油猴脚本

「设置 → 脚本」管理用户脚本:勾选启用/禁用、新建、编辑(Ctrl+S 保存)、从 URL 安装、删除(移到回收站,不确认)、打开文件夹。脚本保存在程序目录的 userscripts\*.user.js,也可以直接把文件放进去;改动会自动同步到所有运行中的实例,已打开的网页刷新后生效。在网页中打开 .user.js 链接(例如 Greasy Fork 的「安装此脚本」按钮)会弹窗显示名称、匹配网址和权限,确认后安装或更新。网页右键「Tray Chrome 选项 → 管理脚本...」可快速进入;脚本通过 GM_registerMenuCommand 注册的命令显示在网页右键「脚本命令」。

支持的元数据:@name(含 @name:zh-CN)、@namespace、@version、@description、@match、@include(通配符或 /正则/)、@exclude、@exclude-match、@run-at(document-start / document-end / document-idle)、@noframes、@require、@resource、@grant、@connect。没有 @match/@include 的脚本匹配所有网页。

支持的接口:GM_info、GM_addStyle、GM_addElement、GM_getValue/GM_setValue/GM_deleteValue/GM_listValues、GM_xmlhttpRequest、GM_openInTab(在本实例新标签页打开)、GM_setClipboard、GM_notification(托盘气泡)、GM_registerMenuCommand/GM_unregisterMenuCommand、GM_getResourceText/GM_getResourceURL、GM_log、unsafeWindow,以及对应的 GM.* Promise 版本。

  • 脚本运行在网页环境中(相当于 Tampermonkey 的 page 注入),unsafeWindow 即 window。不支持 window.onurlchange、GM_download、GM_cookie、GM_webRequest、标签页相关的 GM_getTab 等。
  • GM_xmlhttpRequest 可跨域,自动附带目标站点在本浏览器中的 Cookie(anonymous: true 时不带);必须声明 @grant GM_xmlhttpRequest(或 GM.xmlHttpRequest),声明了 @connect 时只允许访问列出的域名。
  • 每个脚本单独注入,某个脚本有语法错误不影响其他脚本;运行错误输出到 F12 控制台。
  • GM_setValue 数据按脚本保存在 userscripts\.values,所有网站共享;@require/@resource 安装时下载并缓存到 userscripts\.cache,缺失时启动后自动补下载。
  • 脚本可以读取和修改匹配网页的内容,并以你的登录身份发起请求,请只安装信任的脚本。

📁 文件存储

应用程序数据存储在traychrome.exe同目录下,理论上是编写绿色软件。

但是其他电脑上不一定又dotnet环境。

App 组

托盘右键「App 组管理 (G)」或「设置 → App 组」打开独立管理窗口(非模态,编辑时仍可使用浏览器);托盘「加载 App 组」子菜单直接列出各组,点击即加载。

  • ● 当前运行中:下拉框第一项实时管理已运行的全部实例(含隐藏到托盘的,每行标出 PID,本实例标「本实例」)。右键「显示窗口」把该实例点出来;编辑后点「应用」立即修改其标签页 URL、快捷键和图标(快捷键被占用时提示并保留原设置);更换图标立即生效;「关闭实例」/ Del 直接关闭(不确认);「添加 App」启动新实例;「保存为新组...」把当前状态存成组文件。切回窗口或点「刷新」会重新读取。实时修改的图标只作用于该实例,不改共享图标设置;需要保留请保存为组。旧版本实例无法响应时会在标题栏显示数量。

  • 顶部:下拉框切换组文件(只显示文件名,悬停看完整路径),最后一项「+ 新建组...」输入名称后在程序目录创建空组;右侧绿色「加载组」先释放当前实例的快捷键,再启动组内全部 App 到托盘(不弹出窗口),成功后关闭当前实例;加载失败时恢复快捷键并保留当前实例。托盘「加载 App 组」子菜单行为相同,其他已运行实例不受影响。

  • 一行一个实例:列表每行对应一个实例,显示图标、全部网页 URL(悬停逐行显示)和快捷键。

  • 右键菜单:启动(仅启动该实例到托盘)、编辑、更换图标、删除;空白处可「添加 App」。双击或 Enter 编辑,Del 直接删除(不确认,不关闭已运行实例,不删除图标文件)。

  • 编辑 / 添加 App:URL 为多行输入框,每行一个标签页,第一行为当前页,省略协议时自动补 https://,仅支持 HTTP/HTTPS。快捷键框点击后直接按组合键录入(Ctrl/Alt/Shift/Win + A-Z、0-9、F1-F24),「清除」取消绑定;下次启动此 App 生效,同组重复组合无法保存,系统或其他实例占用时跳过绑定仅记日志。更换图标选择 PNG/ICO,复制到 Resources/custom-icons。

  • 把所有已开 App 保存成组:确认后采集同一路径程序的全部运行实例(含隐藏到托盘的),保存各自 URL、标签页、图标、正常窗口尺寸、窗口位置、极简模式和快捷键并覆盖所选组;下次加载按保存的大小、位置和极简模式呈现(位置超出屏幕时自动拉回工作区);任一实例无法读取时不覆盖原配置。多个实例快捷键相同时(例如都沿用共享快捷键),只保留第一个,其余保存为空快捷键。

  • 更多菜单:导入组文件、当前配置另存为、创建桌面快捷方式(双击打开组内全部 App,重名自动加后缀,引用组文件绝对路径)、在资源管理器中打开、移除配置(直接删除 JSON,不确认)。

  • JSON 结构:每个实例一个条目,Url 保存当前页,Tabs 保存其他页,Left/Top 为窗口位置(可省略,省略时使用默认位置);旧配置没有 Tabs 时按单页启动。仅保存 URL,不保存页面会话或滚动状态。

组文件先完整校验,再启动组内 App;普通加载不会关闭或修改原有窗口。如果加载失败,只回收本次新启动的实例。

apps.json 示例(可直接编辑;图标可以是本地 PNG/ICO 文件,相对路径以组文件目录为基准,留空则使用默认图标):

{
  "Name": "工作",
  "Apps": [
    {
      "Url": "https://example.com",
      "IconPath": "icons\\work.png",
      "Width": 480,
      "Height": 640,
      "IsSuperMinimalMode": true,
      "Hotkey": "Ctrl + Alt + 1"
    }
  ]
}

多组文件路径和最近选择保存在程序目录的 app-groups.json;导出组不包含登录状态、密码或网页会话。迁移自定义图标时需同时复制对应图标文件。

组内编辑、更换图标和删除条目会立即保存到当前组文件,与设置窗口底部的「应用」「保存并关闭」无关。 设置保存遇到空白、非数字或越界的窗口尺寸时,会恢复默认宽高(360x640)并记录日志,不再阻止保存。 主窗口最小尺寸为 200x150。启动时自动修复历史配置中的异常尺寸;最小化时保存正常窗口的恢复尺寸,避免将极小的最小化尺寸写入配置。设置中的宽高应用后立即生效。 保存当前窗口到 App 组同样使用正常窗口尺寸;组文件中的异常宽高在读取时恢复默认值,显示托盘窗口前先退出最小化状态并恢复尺寸。 托盘右键「恢复默认大小和位置」可恢复 360x640,并将窗口放回当前屏幕右下角、显示窗口并保存。

自定义图标

「设置 → 外观设置 → 图标设置」提供独立的「自定义」单选项。选择文件默认筛选 PNG,其次为 ICO;点击「应用」或「保存并关闭」后生效。选择无效、损坏或超过 5MB 的图标会提示错误。重启后保留自定义选择,不会再被默认图标覆盖。

托盘右键「自定义图标...」会打开设置并定位到「图标设置」,可选内置图标或自定义文件(未打开过主窗口也可使用)。

裁剪功能暂时停用以排查自定义图标闪退。托盘、外观设置和 App 组选择 PNG/ICO 后均直接导入原图,不再打开裁剪窗口;裁剪代码保留但入口不参与编译。

🛠️ 技术栈

  • 框架:.NET 9.0 + WPF
  • 浏览器引擎:Microsoft WebView2
  • 托盘支持:Hardcodet.NotifyIcon.Wpf
  • 目标平台:Windows 10/11

网页使用标准 WebView2 控件,需要已安装 WebView2 Runtime。项目使用 net9.0-windows,不再引入组合控件所需的大型 Windows SDK .NET 程序集。 窗口透明度及其快捷键已移除,旧配置中的透明度字段会被忽略。Alt 拖动通过网页输入桥接,使用系统实时按键状态和原生窗口移动操作,不依赖 WPF 的鼠标状态;仅在极简模式下生效。网页聚焦时的窗口快捷键通过 WebView2 键盘事件处理。圆角通过 WPF 内容裁剪与标准 WebView2 的原生窗口区域裁剪共同实现,极简模式下同样生效,并跟随尺寸、标签页和 DPI 更新,不引入大型 Windows SDK .NET 依赖。

FAQ

点击托盘后闪退,在哪里查看日志?

程序按进程写入日志到 %LOCALAPPDATA%\TrayChrome\logs,文件名格式为 TrayChrome-日期-进程ID.log。日志包含启动、托盘点击、窗口显示/隐藏、WebView2 初始化失败和未处理异常的堆栈。文件中可能包含本机路径或异常上下文,分享前请检查敏感内容。

explorer.exe "$env:LOCALAPPDATA\TrayChrome\logs"

如果进程被系统或原生组件直接终止,托管异常日志不一定有堆栈;可在 Windows 事件查看器的「Windows 日志 → 应用程序」中查看对应的 .NET Runtime / Application Error 记录。

打包提示 No .NET SDKs were found

打包需要 .NET 9 SDK,仅安装 .NET Desktop Runtime 只能运行程序,不能编译。请从 https://dotnet.microsoft.com/download/dotnet/9.0 安装 Windows x64 SDK,然后运行:

.\pack.ps1

脚本会检查 PATH、DOTNET_ROOT、用户目录的 .dotnet 和 Program Files 中的 SDK。自定义安装位置可以显式指定:

.\pack.ps1 -DotnetPath 'C:\Tools\dotnet\dotnet.exe' -NoPrompt

默认会生成两种 Windows x64 单文件版本,输出位置与执行命令时所在目录无关;可用 -Edition framework-dependent 或 -Edition self-contained 仅生成指定版本:

版本 可执行文件 目标机器的 .NET 要求
精简版 publish\framework-dependent\TrayChrome.exe 安装 .NET 9 Desktop Runtime(x64)
独立版 publish\self-contained\TrayChrome.exe 自带运行时,无需安装 .NET,文件更大

两种版本运行时都不需要 SDK,但都需要安装 WebView2 Runtime;独立版不包含浏览器运行时。两种版本的打包过程都需要 SDK。 仅独立版启用单文件压缩,启动时解压程序集会增加少量开销。.NET 9 不支持精简版单文件压缩(启用会报 NETSDK1176),因此精简版显式关闭压缩。已移除透明度及其大型 Windows SDK .NET 依赖以减小体积;不启用程序集裁剪,以免破坏 WPF 或运行时功能。 脚本遇到任一版本发布失败时会报错并返回非零退出码。旧的 publish\TrayChrome.exe 和配置不会被删除或更新,请使用上述子目录里的新版;迁移已有设置、App 组和自定义图标时,请将相关 JSON 文件和图标资源一并复制到所选版本目录。

只打包精简版并复制到固定目录 C:\AAA\Traychrome:

.\pack1.ps1
# 自定义 SDK 路径(可选)
.\pack1.ps1 -DotnetPath 'C:\Tools\dotnet\dotnet.exe'

此脚本复用 pack.ps1,不生成独立版、不弹出目录询问;打包成功后、复制前,按 PID 强制停止可执行文件路径为 C:\AAA\Traychrome\TrayChrome.exe 的全部实例,等待退出后覆盖 EXE,其他目录的实例不受影响。请先保存未完成的操作,强制停止不会触发退出保存。目标配置、App 组和图标文件保留。打包失败时不停止实例、不复制旧产物;停止或复制失败会报错并返回非零退出码,不自动重新启动实例。

如何配置代理:#15 (comment)

About

menubarX for windows

Topics

Resources

Stars

506 stars

Watchers

3 watching

Forks

Releases

Contributors

Languages