diff --git a/README.md b/README.md index ab945ef..729ab34 100644 --- a/README.md +++ b/README.md @@ -38,19 +38,30 @@ - 根据输入法状态改变鼠标样式 - [样式可以自定义](#自定义鼠标样式) - - 默认使用 [多彩水滴 Oreo 光标](https://zhutix.com/ico/oreo-cu),默认中文状态为红色,英文状态为蓝色,大写锁定为绿色 + - 默认使用 [多彩水滴 Oreo 光标](https://zhutix.com/ico/oreo-cu) + - 默认中文状态为 **红色**,英文状态为 **蓝色**,大写锁定为 **绿色** - 在 [更多已适配的鼠标样式](https://inputtip.pages.dev/download/extra) 中有提供它们的左手镜像版本 - 根据输入法状态在输入光标附近显示不同的 [符号](#关于符号) - - 根据不同应用自动切换不同的输入法状态(英文/中文/大写锁定) + - 默认使用 [白名单机制](https://inputtip.pages.dev/FAQ/about-white-list/) + - 切换不同应用窗口时,自动切换指定的输入法状态(中文/英文/大写锁定) - 快捷键强制切换输入法状态 + - 详尽的自定义配置菜单 + - 所有配置的修改,都在 `托盘菜单` 中进行 -- [版本更新日志](./src/v2/CHANGELOG.md) -- [一些常见的使用问题(FAQ),如果有使用问题,你应该先查看它](https://inputtip.pages.dev/FAQ/) - -> - [点击这里查看 v1 老版本](./src/v1/README.md) (此版本已经没啥用了,不再更新) +> - [查看 v1 老版本](./src/v1/README.md) (此版本已经没啥用了,不再更新) **如果 `InputTip` 对你有所帮助,请考虑给它一个 Star ⭐** +### 新的变化 + +- 请查阅 [更新日志](./src/v2/CHANGELOG.md) + +### 常见问题 + +- 如果有使用上的任何问题,请先确认当前使用的 `InputTip` 是最新版本 version + - 在 `托盘菜单` => `关于` 中查看当前版本号 +- 然后查看相关的说明文档、[常见问题(FAQ)](https://inputtip.pages.dev/FAQ/)、[issues](https://github.com/abgox/InputTip/issues) 等等 + ### 演示 ![demo](https://inputtip.pages.dev/releases/v2/demo.gif) @@ -70,9 +81,13 @@ > - 因为以下原因,可能无法正常运行 `InputTip.exe` > - 没有管理员权限 > - 杀毒软件或防火墙阻止了 `InputTip.exe` 运行 +> - 特殊的系统环境 > - ... > - 你可以尝试以下方案: > 1. 克隆项目仓库到本地 +> ```shell +> git clone --depth 1 https://github.com/abgox/InputTip.git +> ``` > 2. 安装 [AutoHotkey v2](https://www.autohotkey.com/) > 3. 直接运行项目中的 `InputTip.ahk` 文件 > - `src\v2\InputTip.ahk` @@ -83,11 +98,12 @@ > - 现在的 Windows,都内置了 `powershell`,但总有一些特殊环境没有,可能导致运行报错 > - 如何确认是否有 `powershell`? > - 打开 `cmd` 输入 `powershell` 回车,如果出现报错,说明没有 `powershell` +> - 你需要让 `cmd` 能够使用 `powershell` - **[下载](https://inputtip.pages.dev/download) 并运行 `InputTip.exe` 即可** - 你也可以在项目的 Releases 页面下载 - - 推荐做法: 新建一个目录,将 `InputTip.exe` 放入其中,然后再运行它 + - 推荐做法: **新建一个目录,将 `InputTip.exe` 放入其中,然后再运行它** - 因为运行 `InputTip.exe` 后,会产生以下文件或文件夹 - `InputTipCursor` 鼠标样式文件夹 - `InputTipSymbol` 图片符号文件夹 @@ -116,10 +132,11 @@ > [!Warning] > -> - 你应该尽量让三种状态下都有对应的鼠标样式目录路径,且其中包含的鼠标样式文件的数量和类型是一致的 +> - 你应该尽量让三种状态下的鼠标样式文件夹中包含的鼠标样式文件的数量和类型是一致的 > - 比如: > - 如果中文状态的目录路径下有 `IBeam.cur` 或 `IBeam.ani` 文件,英文状态或大写锁定的目录路径下没有。 -> - 则 `IBeam` 类型的鼠标样式将在中文状态下生效,之后由于英文状态或大写锁定的目录路径下缺少对应的样式文件,还会停留在中文状态下的样式 +> - 则切换到中文状态时,会加载中文状态的 `IBeam.cur` +> - 但是再切换到英文或大写锁定时,`IBeam` 类型的鼠标样式不会变化,因为英文和大写锁定缺少对应的样式文件 ### 编译 @@ -127,13 +144,19 @@ > 你可以自行查看源代码并编译 `InputTip` 1. 克隆项目仓库到本地 + + ```shell + git clone --depth 1 https://github.com/abgox/InputTip.git + ``` + 2. 安装 [AutoHotkey v2](https://www.autohotkey.com/) - - 这一步完成后,你也可以直接运行 `src\v2\InputTip.ahk` 使用 + - 这一步完成后,你也可以直接运行 `src\v2\InputTip.ahk` 来使用 `InputTip` 3. 打开 `AutoHotKey Dash` 4. 点击左侧的 `Compile`,等待编译器下载完成 5. 重新点击左侧的 `Compile` 6. 将 `src\v2\InputTip.ahk` 拖入弹出的编译窗口中 7. 点击左下角的 `Convert` 完成编译 +8. 运行编译后的 `InputTip.exe` ### 卸载 @@ -179,7 +202,7 @@ 5. 如果没有生效,可能需要重启电脑 > [!TIP] -> 如果你有多块屏幕,在副屏上,会有非常大的坐标偏差 +> 如果你有多块屏幕,JetBrains IDE 在副屏上,会有非常大的坐标偏差 > > 你需要通过 `托盘菜单` => `设置特殊偏移量` => `设置 JetBrains 系列 IDE 的偏移量` 手动调整 @@ -192,6 +215,7 @@ - `default` 文件夹中包含了默认的图片符号 - 当 `托盘菜单` 中 `更改配置` => `显示形式` => 第 2 个显示配置,选择 `显示图片符号` 时,会在输入光标附近显示对应的图片符号 - 你也可以将自己喜欢的图片符号,或者自己制作图片符号,放入 `InputTipSymbol` 目录下(图片必须是 `.png` 格式) + - [更多的符号图片](https://inputtip.pages.dev/download/extra) - 然后,点击 `托盘菜单` => `更改配置` => `图片符号`,在对应的下拉列表中选择正确的图片路径 - 如果留空,则不会显示对应状态的图片符号 @@ -213,13 +237,15 @@ ### 自定义鼠标样式 +> [!Tip] +> +> 也可以直接下载 [已经适配好的鼠标样式](https://inputtip.pages.dev/download/extra) 来使用 + > [!Tip] > > - `InputTip.exe` 启动后,会在同级目录下生成 `InputTipCursor` 目录,其中包括 `default` 文件夹 > - `default` 用于存放中文/英文/大写锁定状态的 **默认** 鼠标样式 -- 如何设置鼠标样式: `托盘菜单` => `更改配置` => `鼠标样式` => 在下拉列表中选择对应文件夹目录路径 - 1. 你需要在 `InputTipCursor` 目录下创建一个文件夹 - 文件夹中只能包含鼠标样式文件(后缀名为 `.cur` 或 `.ani`) @@ -254,10 +280,11 @@ > [!Warning] > -> - 你应该尽量让三种状态下都有对应的鼠标样式目录路径,且其中包含的鼠标样式文件的数量和类型是一致的 +> - 你应该尽量让三种状态下的鼠标样式文件夹中包含的鼠标样式文件的数量和类型是一致的 > - 比如: > - 如果中文状态的目录路径下有 `IBeam.cur` 或 `IBeam.ani` 文件,英文状态或大写锁定的目录路径下没有。 -> - 则 `IBeam` 类型的鼠标样式将在中文状态下生效,之后由于英文状态或大写锁定的目录路径下缺少对应的样式文件,还会停留在中文状态下的样式 +> - 则切换到中文状态时,会加载中文状态的 `IBeam.cur` +> - 但是再切换到英文或大写锁定时,`IBeam` 类型的鼠标样式不会变化,因为英文和大写锁定缺少对应的样式文件 ### 兼容情况 @@ -265,7 +292,7 @@ > > 这里的兼容情况也仅供参考,实际情况可能有所不同,你应该自行尝试 > -> 如果是讯飞输入法或手心输入法,直接使用对应模式即可 +> 如果是**讯飞**输入法或**手心**输入法,直接使用对应模式即可 > > 建议尝试的顺序是 `通用模式` > `自定义` > @@ -297,7 +324,7 @@ - `手心输入法` - 如果你正在使用 **手心**输入法,你需要选择它 - `自定义` - - [关于设置输入法模式中的自定义](https://inputtip.pages.dev/FAQ/#关于设置输入法模式中的自定义) + - [关于设置输入法模式中的自定义](https://inputtip.pages.dev/FAQ/about-input-mode-custom) - 如何进行模式切换 1. 运行 `InputTip.exe` 后,在底部任务栏右侧找到软件托盘图标 @@ -318,4 +345,6 @@ ### 赞赏支持 +Buy Me a Coffee at ko-fi.com + ![赞赏支持](https://abgox.pages.dev/support.png) diff --git a/src/v2/CHANGELOG.md b/src/v2/CHANGELOG.md index 2f59d27..612bd54 100644 --- a/src/v2/CHANGELOG.md +++ b/src/v2/CHANGELOG.md @@ -4,6 +4,12 @@ - 没有特别说明的版本都是修复问题 +## 2.28.5 + +- 限制同一个配置菜单只能存在一个,避免出现多个相同菜单,导致修改冲突 +- 优化了部分布局和描述 +- 其他的修复和优化 + ## 2.28.4 - 修复了当应用进程列表为空时,双击列表会出现意外行为导致错误的问题 diff --git a/src/v2/InputTip.JAB.JetBrains.exe b/src/v2/InputTip.JAB.JetBrains.exe index 89ee572..2fcb6ba 100644 Binary files a/src/v2/InputTip.JAB.JetBrains.exe and b/src/v2/InputTip.JAB.JetBrains.exe differ diff --git a/src/v2/InputTip.ahk b/src/v2/InputTip.ahk index c0e62dd..c0138de 100644 --- a/src/v2/InputTip.ahk +++ b/src/v2/InputTip.ahk @@ -24,7 +24,44 @@ fileLnk := filename ".lnk" HKEY_startup := "HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Run" ; GUI 控件(gui control) -gc := {} +gc := { + ; 记录所有的窗口 Gui,同一个 Gui 只允许存在一个 + w: { + ; 开机自启动 + startupGui: "", + cancelStartupGui: "", + ; 设置更新检测 + checkUpdateGui: "", + ; 设置输入法模式 + inputModeGui: "", + ; 符号显示黑/白名单 + bwListGui: "", + ; 暂停/运行快捷键 + pauseHotkeyGui: "", + ; 更改配置 + configGui: "", + ; 设置状态切换快捷键 + switchKeyGui: "", + ; 指定窗口自动切换状态 + windowToggleGui: "", + ; 设置特殊偏移量 + offsetGui: "", + ; 设置 JetBrains IDE 偏移量 + JetBrainsOffsetGui: "", + ; 启用 JetBrains IDE 支持 + enableJetBrainsGui: "", + ; 应用列表 + blackListGui: "", + whiteListGui: "", + addJetBrainsGui: "", + ; 关于 + aboutGui: "", + ; 二级菜单 + subGui: "", + customModeGui: "", + shiftSwitchGui: "", + } +} ; 配置菜单的字体大小 diff --git a/src/v2/utils/check-version.ahk b/src/v2/utils/check-version.ahk index 804f902..18b8d71 100644 --- a/src/v2/utils/check-version.ahk +++ b/src/v2/utils/check-version.ahk @@ -36,7 +36,7 @@ checkVersion(currentVersion, callback, urls := [ return } newVersion := Trim(StrReplace(StrReplace(StrReplace(req.responseText, "`r", ""), "`n", ""), "v", "")) - if (newVersion ~= "^[v]?[\d\.]+$" && compareVersion(newVersion, currentVersion) > 0) { + if (newVersion ~= "^[\d\.]+$" && compareVersion(newVersion, currentVersion) > 0) { if (info.version) { return } diff --git a/src/v2/utils/options.ahk b/src/v2/utils/options.ahk index e12acec..355399b 100644 --- a/src/v2/utils/options.ahk +++ b/src/v2/utils/options.ahk @@ -13,5 +13,5 @@ InstallMouseHook CoordMode 'Mouse', 'Screen' SetStoreCapsLockMode 0 -;@AHK2Exe-SetVersion 2.28.4 -currentVersion := "2.28.4" +;@AHK2Exe-SetVersion 2.28.5 +currentVersion := "2.28.5" diff --git a/src/v2/utils/tray-menu.ahk b/src/v2/utils/tray-menu.ahk index 797d114..f4adbf1 100644 --- a/src/v2/utils/tray-menu.ahk +++ b/src/v2/utils/tray-menu.ahk @@ -13,21 +13,49 @@ makeTrayMenu() { A_TrayMenu.Uncheck(item) isStartUp := 0 writeIni("isStartUp", isStartUp) - showMsg(["InputTip 开机自启动已取消", "可通过「托盘菜单」=> 「开机自启动」 再次启用"], "我知道了") + + if (gc.w.cancelStartupGui) { + gc.w.cancelStartupGui.Destroy() + gc.w.cancelStartupGui := "" + } + createGui(_fn).Show() + _fn(x, y, w, h) { + g := Gui("AlwaysOnTop") + g.SetFont(fz, "微软雅黑") + g.AddText(, "InputTip 的") + g.AddText("yp cRed", "开机自启动") + g.AddText("yp", "已取消") + g.AddText("xs", "可通过「托盘菜单」=> 「开机自启动」 再次启用") + y := g.AddButton("w" w, "我知道了") + y.OnEvent("Click", yes) + y.Focus() + g.OnEvent("Close", yes) + yes(*) { + g.Destroy() + } + gc.w.cancelStartupGui := g + return g + } } else { + if (gc.w.startupGui) { + gc.w.startupGui.Flash() + gc.w.startupGui.Show() + return + } + if (A_IsAdmin) { + isDisabled := '' + pad := '' + } else { + isDisabled := ' Disabled' + pad := ' (以管理员模式运行时可用)' + } createGui(fn).Show() fn(x, y, w, h) { g := Gui("AlwaysOnTop +OwnDialogs", "设置开机自启动") g.SetFont(fz, "微软雅黑") g.AddLink(, '详情: https://inputtip.pages.dev/FAQ/#关于开机自启动') g.AddLink(, "当前有多种方式设置开机自启动,请选择有效的方式 :`n`n1. 通过「任务计划程序」`n2. 通过软件快捷方式`n3. 通过添加「注册表」`n`n「任务计划程序」可以避免管理员授权窗口(UAC)的干扰(部分用户无效)") - if (A_IsAdmin) { - isDisabled := '' - pad := '' - } else { - isDisabled := ' Disabled' - pad := ' (以管理员模式运行时可用)' - } + btn := g.AddButton("w" w isDisabled, "使用「任务计划程序」" pad) btn.Focus() btn.OnEvent("Click", fn_startUp_task) @@ -53,18 +81,24 @@ makeTrayMenu() { RegWrite(A_ScriptFullPath, "REG_SZ", "HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Run", A_ScriptName) fn_handle() } catch { + fn_handle(1) MsgBox("添加注册表失败!", , "0x1000 0x10") } } - fn_handle() { + g.OnEvent("Close", fn_handle) + fn_handle(err := 0, *) { g.Destroy() - if (isStartUp) { - A_TrayMenu.Check(item) - } else { - A_TrayMenu.Uncheck(item) + gc.w.startupGui := "" + if (!err) { + if (isStartUp) { + A_TrayMenu.Check(item) + } else { + A_TrayMenu.Uncheck(item) + } + writeIni("isStartUp", isStartUp) } - writeIni("isStartUp", isStartUp) } + gc.w.startupGui := g return g } } @@ -74,8 +108,14 @@ makeTrayMenu() { } A_TrayMenu.Add("设置更新检测", fn_check_update) fn_check_update(item, *) { + if (gc.w.checkUpdateGui) { + gc.w.checkUpdateGui.Flash() + gc.w.checkUpdateGui.Show() + return + } createGui(fn).Show() fn(x, y, w, h) { + gc.checkUpdateDelay := checkUpdateDelay g := Gui("AlwaysOnTop", "InputTip - 设置更新检测") g.SetFont(fz, "微软雅黑") g.AddText("cRed", "- 单位: 分钟,默认 1440 分钟(1 天)。`n- 避免程序错误,可以设置的最大范围是 0-50000 分钟。`n- 如果为 0,则表示不检测版本更新。`n- 如果不为 0,在 InputTip 启动后,会立即检测一次。`n- 如果大于 50000,则会直接使用 50000。`n") @@ -97,11 +137,25 @@ makeTrayMenu() { } } } + g.OnEvent("Close", close) + close(*) { + g.Destroy() + gc.w.checkUpdateGui := "" + if (gc.checkUpdateDelay = 0 && checkUpdateDelay != 0) { + checkUpdate(1) + } + } + gc.w.checkUpdateGui := g return g } } A_TrayMenu.Add("设置输入法模式", fn_input_mode) fn_input_mode(item, *) { + if (gc.w.inputModeGui) { + gc.w.inputModeGui.Flash() + gc.w.inputModeGui.Show() + return + } createGui(fn).Show() fn(x, y, w, h) { global statusModeEN, conversionModeEN, mode, checkTimeout, gc @@ -129,6 +183,10 @@ makeTrayMenu() { last := item.Value if (item.Value = 1) { + if (gc.w.customModeGui) { + gc.w.customModeGui.Destroy() + gc.w.customModeGui := "" + } createGui(fn).Show() fn(x, y, w, h) { g := Gui("AlwaysOnTop") @@ -136,7 +194,9 @@ makeTrayMenu() { bw := w - g.MarginX * 2 g.AddText("cRed", "请前往 「自定义」 配置页面中设置,此处无法直接修改") g.AddText("cRed", "在配置页面的左上角,「基础配置」的右侧") - g.AddButton("w" bw, "我知道了").OnEvent("Click", yes) + y := g.AddButton("w" bw, "我知道了") + y.OnEvent("Click", yes) + y.Focus() g.OnEvent("Close", yes) yes(*) { g.Destroy() @@ -144,6 +204,7 @@ makeTrayMenu() { gc.mode.Value := mode + 1 } } + gc.w.customModeGui := g return g } } else { @@ -209,6 +270,10 @@ makeTrayMenu() { if (useShift = item.Value) { createGui(fn).Show() fn(x, y, w, h) { + if (gc.w.shiftSwitchGui) { + gc.w.shiftSwitchGui.Destroy() + gc.w.shiftSwitchGui := "" + } g := Gui("AlwaysOnTop") g.SetFont(fz, "微软雅黑") bw := w - g.MarginX * 2 @@ -217,6 +282,7 @@ makeTrayMenu() { g.AddText("cRed", "更建议不要使用【否】,而是启用 Shift 切换状态,这也是几乎所有输入法的默认设置。") g.AddButton("w" bw, "我确定要使用【否】").OnEvent("Click", yes) g.AddButton("w" bw, "不,我只是误点了").OnEvent("Click", no) + g.OnEvent("Close", no) yes(*) { g.Destroy() value := item.Value - 1 @@ -229,6 +295,7 @@ makeTrayMenu() { gc.useShift.Value := useShift + 1 } } + gc.w.shiftSwitchGui := g return g } } else { @@ -327,11 +394,23 @@ makeTrayMenu() { } } g.AddEdit("xs r10 ReadOnly cGray w" w, "1. 当点击按钮 「显示实时的状态码和切换码」之后,在鼠标位置会实时显示当前的状态码和切换码。`n2. 你需要来回切换输入法中英文状态进行观察,如果不同状态时的值是唯一的,就将它填入对应的输入框中。`n3. 英文状态时的状态码和切换码在不同窗口可能不同,但只要是唯一的,就应该被填写,多个就用空格分割。`n`n举个例子: `n假如当你切换到英文后,状态码显示 0,切换码显示 1025。`n切换到中文后,状态码显示 1,切换码显示 1025。`n换到另一个窗口后又发现,英文时状态码显示 3,切换码显示 1025,中文时状态码显示 4,切换码显示 1025。`n可以发现,英文的状态码 0 和 3 是唯一的,没有在中文状态时出现,因此当状态码是它们时,可以确定当前一定是英文状态,像这样的就应该将它们填入状态码输入框中,用空格分割,即 0 3`n而切换码相反,中英文状态时都为 1025,没有办法通过 1025 去判断当前是中文还是英文,就不填切换码,保持切换码为空。") + + g.OnEvent("Close", fn_close) + fn_close(*) { + g.Destroy() + gc.w.inputModeGui := "" + } + gc.w.inputModeGui := g return g } } A_TrayMenu.Add("符号显示黑/白名单", fn_bw_list) fn_bw_list(*) { + if (gc.w.bwListGui) { + gc.w.bwListGui.Flash() + gc.w.bwListGui.Show() + return + } createGui(fn).Show() fn(x, y, w, h) { g := Gui("AlwaysOnTop", "InputTip - 设置符号显示的黑/白名单") @@ -339,7 +418,7 @@ makeTrayMenu() { bw := w - g.MarginX * 2 g.AddText("cRed", "「白」名单机制: 只有在白名单中的应用进程窗口会显示符号。`n「黑」名单机制: 只有不在黑名单中的应用进程窗口会显示符号。") - g.AddText(, "1. 建议使用白名单机制,这样可以精确控制哪些应用进程窗口需要显示符号。`n2. 使用白名单机制,可以减少大量特殊窗口的兼容性问题。`n3. 如果选择了白名单机制,请及时添加你需要使用的应用进程到白名单中。") + g.AddLink(, '1. 建议使用 白名单机制,这样可以精确控制哪些应用进程窗口需要显示符号。`n2. 使用白名单机制,可以减少大量特殊窗口的兼容性问题。`n3. 如果选择了白名单机制,请及时添加你需要使用的应用进程到白名单中。') g.AddText(, "-------------------------------------------------------------------------------------") g.AddText(, "选择显示符号的名单机制: ") @@ -350,24 +429,28 @@ makeTrayMenu() { global useWhiteList := value restartJetBrains() } - g.AddButton("xs w" bw, "设置「白」名单").OnEvent("Click", set_white_list) + _c := g.AddButton("xs w" bw, "设置「白」名单") + _c.OnEvent("Click", set_white_list) + _c.Focus() set_white_list(*) { - g.Destroy() + fn_close() fn_white_list() } g.AddButton("xs w" bw, "设置「黑」名单").OnEvent("Click", set_black_list) set_black_list(*) { - g.Destroy() + fn_close() fn_common({ + gui: "blackListGui", config: "app_hide_state", tab: ["管理黑名单", "关于"], tip: "你首先应该点击上方的 「关于」查看具体的操作说明。", list: "符号显示黑名单", color: "cRed", - about: '如何使用这个管理面板?`n`n- 最上方的列表页显示的是当前系统正在运行的应用进程(仅包含有前台窗口的)`n- 双击列表中任意应用进程,就可以将其添加到「符号显示黑名单」中。`n- 如果需要更多的进程,请点击右下角的「显示更多进程」以显示后台和隐藏进程。`n- 也可以点击右下角的 「通过输入进程名称手动添加」直接添加进程名称。`n- 下方是「符号显示黑名单」应用进程列表,如果使用黑名单机制,它将生效。`n- 双击列表中任意应用进程,就可以将它移除。`n`n- 黑名单机制: 只有不在黑名单中的应用进程窗口才会显示符号。`n- 使用黑名单,可能会有一些特殊窗口的兼容性问题。`n- 建议使用白名单机制,最好少用黑名单机制。', + about: '1. 如何使用这个管理面板?`n - 最上方的列表页显示的是当前系统正在运行的应用进程(仅前台窗口)`n - 双击列表中任意应用进程,就可以将其添加到「符号显示黑名单」中。`n - 如果需要更多的进程,请点击右下角的「显示更多进程」以显示后台和隐藏进程。`n - 也可以点击右下角的 「通过输入进程名称手动添加」直接添加进程名称。`n - 下方是「符号显示黑名单」应用进程列表,如果使用黑名单机制,它将生效。`n - 双击列表中任意应用进程,就可以将它移除。`n`n - 黑名单机制: 只有不在黑名单中的应用进程窗口才会显示符号。`n - 使用黑名单,可能会有一些特殊窗口的兼容性问题。`n - 建议使用 白名单机制,最好少用黑名单机制。`n`n2. 如何快速添加应用进程?`n - 每次双击应用进程后,会弹出操作窗口,需要选择添加/移除或取消`n - 如果你确定当前操作不需要取消,可以在操作窗口弹出后,按下空格键快速确认', addConfirm: "是否要将", addConfirm2: "添加到「符号显示黑名单」中?", addConfirm3: "添加后,黑名单机制下,在此应用窗口中时,不会显示符号(图片/方块/文本符号)", + addConfirm4: "", rmConfirm: "是否要将", rmConfirm2: "从「符号显示黑名单」中移除?", rmConfirm3: "移除后,黑名单机制下,在此应用窗口中时,会显示符号(图片/方块/文本符号)", @@ -379,6 +462,12 @@ makeTrayMenu() { restartJetBrains() } } + g.OnEvent("Close", fn_close) + fn_close(*) { + g.Destroy() + gc.w.bwListGui := "" + } + gc.w.bwListGui := g return g } } @@ -386,6 +475,11 @@ makeTrayMenu() { A_TrayMenu.Add("暂停/运行", pauseApp) A_TrayMenu.Add("暂停/运行快捷键", fn_pause_hotkey) fn_pause_hotkey(*) { + if (gc.w.pauseHotkeyGui) { + gc.w.pauseHotkeyGui.Flash() + gc.w.pauseHotkeyGui.Show() + return + } hotkeyGui := Gui("AlwaysOnTop") hotkeyGui.SetFont(fz, "微软雅黑") hotkeyGui.AddText(, "-------------------------------------------------------------------------------------") @@ -445,7 +539,7 @@ makeTrayMenu() { tab.UseTab(2) hotkeyGui.AddLink("Section", "1.") hotkeyGui.AddLink("yp cRed", "优先使用「设置组合快捷键」设置,除非因为快捷键占用无法设置。") - hotkeyGui.AddLink("xs", '2. 如何手动输入快捷键:https://inputtip.pages.dev/enter-shortcuts-manually') + hotkeyGui.AddLink("xs", '2. 如何手动输入快捷键:https://inputtip.pages.dev/FAQ/enter-shortcuts-manually') hotkeyGui.AddText("xs", "3. 如果 InputTip 正在运行,此时按下快捷键,会停止运行。") hotkeyGui.AddText("xs", "4. 如果 InputTip 已经暂停,此时按下快捷键,会恢复运行。") hotkeyGui.AddText("xs", "-------------------------------------------------------------------------------------") @@ -480,6 +574,13 @@ makeTrayMenu() { writeIni("hotkey_Pause", key) fn_restart() } + + hotkeyGui.OnEvent("Close", fn_close) + fn_close(*) { + hotkeyGui.Destroy() + gc.w.pauseHotkeyGui := "" + } + gc.w.pauseHotkeyGui := hotkeyGui hotkeyGui.Show() } A_TrayMenu.Add("打开软件所在目录", fn_open_dir) @@ -489,6 +590,11 @@ makeTrayMenu() { A_TrayMenu.Add() A_TrayMenu.Add("更改配置", fn_config) fn_config(*) { + if (gc.w.configGui) { + gc.w.configGui.Flash() + gc.w.configGui.Show() + return + } line := "-----------------------------------------------------------------------------------------------" configGui := Gui("AlwaysOnTop") configGui.SetFont(fz, "微软雅黑") @@ -534,15 +640,22 @@ makeTrayMenu() { createGui(fn).Show() fn(x, y, w, h) { + if (gc.w.subGui) { + gc.w.subGui.Destroy() + gc.w.subGui := "" + } g := Gui("AlwaysOnTop") g.SetFont(fz, "微软雅黑") bw := w - g.MarginX * 2 g.AddText(, "正在尝试恢复到使用 InputTip 之前的鼠标样式。") g.AddText("cRed", "可能无法完全恢复,你需要进行以下额外步骤或者重启系统:`n1. 进入「系统设置」=>「蓝牙和其他设备」=> 「鼠标」=>「其他鼠标设置」`n2. 先更改为另一个鼠标样式方案,再改回你之前使用的方案") - g.AddButton("w" bw, "我知道了").OnEvent("Click", yes) + y := g.AddButton("w" bw, "我知道了") + y.OnEvent("Click", yes) + y.Focus() yes(*) { g.Destroy() } + gc.w.subGui := g return g } } else { @@ -563,7 +676,7 @@ makeTrayMenu() { updateSymbol() reloadSymbol() } - configGui.AddText("xs", "3. 无操作时,符号在多少") + configGui.AddText("xs", "3. 无键盘和鼠标左键点击操作时,符号在多少") configGui.AddText("yp cRed", "毫秒") configGui.AddText("yp", "后隐藏:") configGui.AddEdit("yp w150 Number", HideSymbolDelay).OnEvent("Change", fn_hide_symbol_delay) @@ -581,7 +694,7 @@ makeTrayMenu() { updateDelay() restartJetBrains() } - configGui.AddEdit("xs Disabled -VScroll w" Gui_width, "单位: 毫秒,默认为 0 毫秒,表示不隐藏符号。`n当不为 0 时,此值不能小于 150,若小于 150,实际生效的值是 150。建议 500 以上。`n符号隐藏后,下次键盘操作或点击鼠标左键会再次显示符号") + configGui.AddEdit("xs Disabled -VScroll w" Gui_width, "单位: 毫秒,默认为 0 毫秒,表示不隐藏符号。`n当不为 0 时,此值不能小于 150,若小于 150,则使用 150。建议 500 以上。`n符号隐藏后,下次键盘操作或点击鼠标左键会再次显示符号") configGui.AddText("xs", "4. 每多少") configGui.AddText("yp cRed", "毫秒") configGui.AddText("yp", "后更新符号的显示位置和状态:") @@ -659,6 +772,10 @@ makeTrayMenu() { } configGui.AddButton("xs w" Gui_width, "下载鼠标样式扩展包").OnEvent("Click", fn_cursor_package) fn_cursor_package(*) { + if (gc.w.subGui) { + gc.w.subGui.Destroy() + gc.w.subGui := "" + } dlGui := Gui("AlwaysOnTop", "下载鼠标样式扩展包") dlGui.SetFont(fz, "微软雅黑") dlGui.AddText("Center h30", "从以下任意可用地址中下载鼠标样式扩展包:") @@ -667,6 +784,7 @@ makeTrayMenu() { dlGui.AddLink("xs", 'https://gitee.com/abgox/InputTip/releases/tag/extra') dlGui.AddText(, "其中的鼠标样式已经完成适配,解压到 InputTipCursor 目录中即可使用") dlGui.Show() + gc.w.subGui := dlGui } tab.UseTab(3) configGui.AddLink("Section", '点击下方链接查看图片符号的详情说明: 官网 Github Gitee' "`n" line) @@ -771,6 +889,10 @@ makeTrayMenu() { configGui.AddButton("xs w" Gui_width, "下载图片符号扩展包").OnEvent("Click", fn_pic_package) fn_pic_package(*) { + if (gc.w.subGui) { + gc.w.subGui.Destroy() + gc.w.subGui := "" + } dlGui := Gui("AlwaysOnTop", "下载图片符号扩展包") dlGui.SetFont(fz, "微软雅黑") dlGui.AddText("Center h30", "从以下任意可用地址中下载图片符号扩展包:") @@ -779,6 +901,7 @@ makeTrayMenu() { dlGui.AddLink("xs", 'https://gitee.com/abgox/InputTip/releases/tag/extra') dlGui.AddText(, "将其中的图片解压到 InputTipSymbol 目录中即可使用") dlGui.Show() + gc.w.subGui := dlGui } tab.UseTab(4) @@ -998,6 +1121,12 @@ makeTrayMenu() { configGui.AddLink(, 'https://color.adobe.com/zh/create/color-wheel') configGui.AddLink(, 'https://colordesigner.io/color-palette-builder') + configGui.OnEvent("Close", fn_close) + fn_close(*) { + configGui.Destroy() + gc.w.configGui := "" + } + gc.w.configGui := configGui configGui.Show() SetTimer(getDirTimer, -1) getDirTimer() { @@ -1015,6 +1144,11 @@ makeTrayMenu() { } A_TrayMenu.Add("设置状态切换快捷键", fn_switch_key) fn_switch_key(*) { + if (gc.w.switchKeyGui) { + gc.w.switchKeyGui.Flash() + gc.w.switchKeyGui.Show() + return + } hotkeyGui := Gui("AlwaysOnTop") hotkeyGui.SetFont(fz, "微软雅黑") hotkeyGui.AddText(, "-------------------------------------------------------------------------------------") @@ -1162,7 +1296,7 @@ makeTrayMenu() { tab.UseTab(3) hotkeyGui.AddLink("Section", "1.") hotkeyGui.AddLink("yp cRed", "优先使用「设置单键」或「设置组合快捷键」设置,除非因为快捷键占用无法设置。") - hotkeyGui.AddLink("xs", '2. 如何手动输入快捷键:https://inputtip.pages.dev/enter-shortcuts-manually`n-------------------------------------------------------------------------------------') + hotkeyGui.AddLink("xs", '2. 如何手动输入快捷键:https://inputtip.pages.dev/FAQ/enter-shortcuts-manually`n-------------------------------------------------------------------------------------') for v in configList { hotkeyGui.AddText("xs", "强制切换到") hotkeyGui.AddText("yp cRed", v.tip) @@ -1200,22 +1334,34 @@ makeTrayMenu() { } fn_restart() } + + hotkeyGui.OnEvent("Close", fn_close) + fn_close(*) { + hotkeyGui.Destroy() + gc.w.switchKeyGui := "" + } + gc.w.switchKeyGui := hotkeyGui hotkeyGui.Show() } A_TrayMenu.Add("指定窗口自动切换状态", fn_window) fn_window(*) { - show() - show(deep := "") { + showGui() + showGui(deep := "") { + if (gc.w.windowToggleGui) { + gc.w.windowToggleGui.Flash() + gc.w.windowToggleGui.Show() + return + } createGui(fn).Show() fn(x, y, w, h) { g := Gui("AlwaysOnTop") g.SetFont(fz, "微软雅黑") bw := w - g.MarginX * 2 - tab := g.AddTab3("-Wrap", ["管理自动切换", "关于"]) + tab := g.AddTab3("-Wrap", ["管理状态自动切换", "关于"]) tab.UseTab(1) g.AddLink("Section cRed", "你首先应该点击上方的 「关于」查看具体的操作说明。") - gc.LV_add := g.AddListView("-LV0x10 -Multi r7 NoSortHdr Sort Grid w" bw, ["正在运行的应用进程列表", "窗口标题"]) + gc.LV_add := g.AddListView("-LV0x10 -Multi r7 NoSortHdr Sort Grid w" bw, ["正在运行的应用进程列表", "窗口标题", "应用进程文件所在位置"]) gc.LV_add.OnEvent("DoubleClick", fn_add) fn_add(LV, RowNumber) { handleClick(LV, RowNumber, "add") @@ -1234,7 +1380,7 @@ makeTrayMenu() { title := WinGetTitle("ahk_id " v) if (!InStr(temp, ":" exe_name ":") && !InStr(res, ":" exe_name ":")) { temp .= exe_name ":" - gc.LV_add.Add(, exe_name, WinGetTitle("ahk_id " v)) + gc.LV_add.Add(, exe_name, WinGetTitle("ahk_id " v), WinGetProcessPath("ahk_id " v)) } } } @@ -1413,6 +1559,10 @@ makeTrayMenu() { addApp(v) { createGui(fn).Show() fn(x, y, w, h) { + if (gc.w.subGui) { + gc.w.subGui.Destroy() + gc.w.subGui := "" + } g_2 := Gui("AlwaysOnTop", "InputTip - 通过输入进程名称手动添加") g_2.SetFont(fz, "微软雅黑") bw := w - g_2.MarginX * 2 @@ -1445,7 +1595,9 @@ makeTrayMenu() { g_2.SetFont(fz, "微软雅黑") bw := w - g_2.MarginX * 2 g_2.AddText(, "进程名称不符合格式要求,请重新输入") - g_2.AddButton("w" bw, "我知道了").OnEvent("click", close) + y := g_2.AddButton("w" bw, "我知道了") + y.OnEvent("click", close) + y.Focus() close(*) { g_2.Destroy() addApp(exe_name) @@ -1466,6 +1618,7 @@ makeTrayMenu() { global app_EN := ":" readIni('app_EN', '') ":" global app_Caps := ":" readIni('app_Caps', '') ":" } + gc.w.subGui := g_2 return g_2 } } @@ -1473,30 +1626,43 @@ makeTrayMenu() { if (deep) { g.AddButton("yp w" bw / 2, "显示更少进程(仅包含已经打开的窗口)").OnEvent("Click", fn_less_window) fn_less_window(*) { - g.Destroy() - show("") + fn_close() + showGui("") } } else { g.AddButton("yp w" bw / 2, "显示更多进程(包含后台和隐藏窗口)").OnEvent("Click", fn_more_window) fn_more_window(*) { - g.Destroy() - show(1) + fn_close() + showGui(1) } } gc.LV_add.ModifyCol(1, "AutoHdr") gc.LV_add.ModifyCol(2, "AutoHdr") + gc.LV_add.ModifyCol(3, "AutoHdr") tab.UseTab(2) - g.AddLink(, "如何使用这个管理面板?`n`n- 最上方的列表页显示的是当前系统正在运行的应用进程(仅包含有前台窗口的)`n- 双击列表中任意应用进程,就可以将其添加到下方任意列表中。`n- 如果需要更多的进程,请点击右下角的「显示更多进程」以显示后台和隐藏进程。`n- 也可以点击右下角的「通过输入进程名称手动添加」直接添加进程名称。`n- 下方分别是中文、英文、大写锁定这三个自动切换列表。`n- 在自动切换列表中的应用窗口被激活时,会自动切换到对应的输入法状态。`n- 双击列表中任意应用进程,就可以将它移除或者添加到其他列表中。`n`n- 举个例子: `n - 你可以双击上方正在运行的应用进程列表中的其中一个应用进程。`n - 然后在弹出的操作窗口中,选择将其添加到哪一个列表中。`n - 添加完成后,会在下方对应列表中显示,并实时生效。`n - 你也可以双击下方列表中的其中一个应用进程进行同样的操作。") + g.AddLink(, "如何使用这个管理面板?`n`n- 最上方的列表页显示的是当前系统正在运行的应用进程(仅前台窗口)`n- 双击列表中任意应用进程,就可以将其添加到下方任意列表中。`n- 如果需要更多的进程,请点击右下角的「显示更多进程」以显示后台和隐藏进程。`n- 也可以点击右下角的「通过输入进程名称手动添加」直接添加进程名称。`n- 下方分别是中文、英文、大写锁定这三个自动切换列表。`n- 在自动切换列表中的应用窗口被激活时,会自动切换到对应的输入法状态。`n- 双击列表中任意应用进程,就可以将它移除或者添加到其他列表中。`n`n- 举个例子: `n - 你可以双击上方正在运行的应用进程列表中的其中一个应用进程。`n - 然后在弹出的操作窗口中,选择将其添加到哪一个列表中。`n - 添加完成后,会在下方对应列表中显示,并实时生效。`n - 你也可以双击下方列表中的其中一个应用进程进行同样的操作。") + + g.OnEvent("Close", fn_close) + fn_close(*) { + g.Destroy() + gc.w.windowToggleGui := "" + } + gc.w.windowToggleGui := g return g } } } A_TrayMenu.Add("设置特殊偏移量", fn_offset) fn_offset(*) { + if (gc.w.offsetGui) { + gc.w.offsetGui.Flash() + gc.w.offsetGui.Show() + return + } offsetGui := Gui("AlwaysOnTop") offsetGui.SetFont(fz, "微软雅黑") offsetGui.AddText("Section", "- 由于 JetBrains 系列 IDE,在副屏上会存在极大的坐标偏差`n- 需要自己手动的通过调整对应屏幕的偏移量,使其正确显示`n- 注意: 你需要先开启 Java Access Bridge,具体操作步骤,请查看以下网址:") - offsetGui.AddLink(, 'https://inputtip.pages.dev/FAQ/#如何在-jetbrains-系列-ide-中使用-inputtip') + offsetGui.AddLink(, 'InputTip 官网: 如何在 Jetbrains 系列 IDE 中使用 InputTip') offsetGui.Show("Hide") offsetGui.GetPos(, , &Gui_width) offsetGui.Destroy() @@ -1505,14 +1671,19 @@ makeTrayMenu() { offsetGui.SetFont(fz, "微软雅黑") tab := offsetGui.AddTab3("-Wrap", ["JetBrains IDE"]) tab.UseTab(1) - offsetGui.AddText("Section", "- 由于 JetBrains 系列 IDE,在副屏上会存在极大的坐标偏差`n- 需要自己通过手动调整对应屏幕的偏移量,使其正确显示`n- 你可以通过以下链接了解如何在 JetBrains 系列 IDE 中使用 InputTip :") - offsetGui.AddLink(, '- https://inputtip.pages.dev/FAQ/#如何在-jetbrains-系列-ide-中使用-inputtip`n- https://github.com/abgox/InputTip#如何在-jetbrains-系列-ide-中使用-inputtip`n- https://gitee.com/abgox/InputTip#如何在-jetbrains-系列-ide-中使用-inputtip') - btn := offsetGui.AddButton("w" Gui_width, "设置 JetBrains 系列 IDE 的偏移量") + offsetGui.AddText("Section", "- 由于 JetBrains 系列 IDE,在副屏上会存在极大的坐标偏差`n- 你需要通过手动调整对应屏幕的偏移量,使其正确显示`n`n- 通过以下链接了解如何在 Jetbrains 系列 IDE 中使用 InputTip") + offsetGui.AddLink(, ' InputTip 官网 Github Gitee`n') + btn := offsetGui.AddButton("w" Gui_width - offsetGui.MarginX * 2, "设置 JetBrains 系列 IDE 的偏移量") btn.Focus() btn.OnEvent("Click", JetBrains_offset) JetBrains_offset(*) { - offsetGui.Destroy() + fn_close() + if (gc.w.JetBrainsOffsetGui) { + gc.w.JetBrainsOffsetGui.Flash() + gc.w.JetBrainsOffsetGui.Show() + return + } JetBrainsGui := Gui("AlwaysOnTop", "InputTip - 设置 JetBrains 系列 IDE 的偏移量") JetBrainsGui.SetFont(fz, "微软雅黑") screenList := getScreenInfo() @@ -1530,7 +1701,7 @@ makeTrayMenu() { JetBrainsGui.AddText(, "这是副屏幕(副显示器)") } - JetBrainsGui.AddText(, "屏幕坐标信息: 左上角(" v.left ", " v.top "),右下角(" v.right ", " v.bottom ")") + JetBrainsGui.AddText(, "屏幕坐标信息(X,Y): 左上角(" v.left ", " v.top "),右下角(" v.right ", " v.bottom ")") x := 0, y := 0 try { @@ -1555,8 +1726,20 @@ makeTrayMenu() { writeIni("offset_JetBrains_y_" item.__num, returnNumber(item.Value)) } } + JetBrainsGui.OnEvent("Close", close) + close(*) { + JetBrainsGui.Destroy() + gc.w.JetBrainsOffsetGui := "" + } + gc.w.JetBrainsOffsetGui := JetBrainsGui JetBrainsGui.Show() } + offsetGui.OnEvent("Close", fn_close) + fn_close(*) { + offsetGui.Destroy() + gc.w.offsetGui := "" + } + gc.w.offsetGui := offsetGui offsetGui.Show() } A_TrayMenu.Add("启用 JetBrains IDE 支持", fn_JetBrains) @@ -1567,27 +1750,36 @@ makeTrayMenu() { if (enableJetBrainsSupport) { FileInstall("InputTip.JAB.JetBrains.exe", "InputTip.JAB.JetBrains.exe", 1) waitFileInstall("InputTip.JAB.JetBrains.exe", 0) - createGui(fn).Show() - fn(x, y, w, h) { - g := Gui("AlwaysOnTop") - g.SetFont(fz, "微软雅黑") - bw := w - g.MarginX * 2 - g.AddText(, "已成功启用 JetBrains IDE 支持,你还需要进行以下步骤:") - g.AddEdit("xs -VScroll ReadOnly w" bw, "1. 开启 Java Access Bridge`n2. 点击托盘菜单中的 「添加 JetBrains IDE 应用」,确保要使用的 IDE 已经添加`n3. 如果正在使用白名单机制,还需要添加到白名单中。`n4. 如果未生效,请重启正在使用的 JetBrains IDE 或重启系统") - g.AddText(, "具体操作步骤,请查看以下任意网址:") - g.AddLink(, '- https://inputtip.pages.dev/FAQ/#如何在-jetbrains-系列-ide-中使用-inputtip') - g.AddLink(, '- https://github.com/abgox/InputTip#如何在-jetbrains-系列-ide-中使用-inputtip') - g.AddLink(, '- https://gitee.com/abgox/InputTip#如何在-jetbrains-系列-ide-中使用-inputtip') - _c := g.AddButton("xs w" bw, "我知道了") - _c.OnEvent("Click", yes) - _c.Focus() - yes(*) { - g.Destroy() - } - return g + + ideGui := Gui("AlwaysOnTop", "InputTip - 启用 JetBrains IDE 支持") + ideGui.SetFont(fz, "微软雅黑") + ideGui.AddText(, "------------------------------------------------------------------------------") + ideGui.Show("Hide") + ideGui.GetPos(, , &Gui_width) + ideGui.Destroy() + + ideGui := Gui("AlwaysOnTop", "InputTip - 启用 JetBrains IDE 支持") + ideGui.SetFont(fz, "微软雅黑") + ideGui.AddText(, "已经成功启用了 JetBrains IDE 支持,你还需要进行以下步骤:") + + ideGui.AddEdit("xs -VScroll ReadOnly w" Gui_width, "1. 开启 Java Access Bridge`n2. 点击托盘菜单中的 「添加 JetBrains IDE 应用」,确保要使用的 IDE 已经添加`n3. 如果未生效,请重启正在使用的 JetBrains IDE`n4. 如果仍未生效,请重启 InputTip 或重启系统") + ideGui.AddLink(, '详细操作步骤,请查看: InputTip 官网 Github Gitee') + y := ideGui.AddButton("xs w" Gui_width, "我知道了") + y.OnEvent("Click", yes) + y.Focus() + ideGui.OnEvent("Close", yes) + yes(*) { + ideGui.Destroy() + gc.w.enableJetBrainsGui := "" } + gc.w.enableJetBrainsGui := ideGui + ideGui.Show() runJetBrains() } else { + if (gc.w.enableJetBrainsGui) { + gc.w.enableJetBrainsGui.Destroy() + gc.w.enableJetBrainsGui := "" + } SetTimer(killAppTimer, -10) killAppTimer() { try { @@ -1605,20 +1797,17 @@ makeTrayMenu() { A_TrayMenu.Add("添加 JetBrains IDE 应用", fn_add_JetBrains) fn_add_JetBrains(*) { fn_common({ + gui: "addJetBrainsGui", config: "JetBrains_list", tab: ["管理 JetBrains IDE 应用", "关于"], tip: "你首先应该点击上方的 「关于」查看具体的操作说明。", list: "JetBrains IDE 应用列表", color: "cBlue", - about: '如何使用这个管理面板?`n`n- 最上方的列表页显示的是当前系统正在运行的应用进程(仅包含有前台窗口的)`n- 双击列表中任意应用进程,就可以将其添加到「JetBrains IDE 应用进程列表」中。`n- 如果需要更多的进程,请点击右下角的「显示更多进程」以显示后台和隐藏进程。`n- 也可以点击右下角的「通过输入进程名称手动添加」直接添加进程名称。`n- 下方是「JetBrains IDE 应用进程列表」。`n- 你需要将你使用的 JetBrains IDE 应用进程添加进去,它会实时生效。`n- 如果正在使用白名单机制,还需要再添加到白名单中。`n- 如果不小心将其他应用添加了,需要双击下方列表中的应用进程将它移除。`n- 在 IDE 添加完成后,勾选「启用 JetBrains IDE 支持」,就可以在 IDE 中使用 InputTip 了。`n- 如果未生效,请检查是否完成所有操作步骤。`n`n操作步骤相关链接: `n`n- https://inputtip.pages.dev/FAQ/#如何在-jetbrains-系列-ide-中使用-inputtip`n- https://github.com/abgox/InputTip#如何在-jetbrains-系列-ide-中使用-inputtip`n- https://gitee.com/abgox/InputTip#如何在-jetbrains-系列-ide-中使用-inputtip', - addTopText: "2. 双击应用进程进行添加`n3. 如果有非 JetBrains 系列 IDE 应用进程被意外添加,请立即移除`n4. 白名单机制下,还需要再添加到白名单中才会有效。", - addList: "以下列表是当前正在运行的应用进程", - addList1: "以下列表是当前系统正在运行的应用进程(包含后台和隐藏窗口)", + about: '1. 如何使用这个管理面板?`n - 最上方的列表页显示的是当前系统正在运行的应用进程(仅前台窗口)`n - 双击列表中任意应用进程,就可以将其添加到「JetBrains IDE 应用进程列表」中。`n - 如果需要更多的进程,请点击右下角的「显示更多进程」以显示后台和隐藏进程。`n - 也可以点击右下角的「通过输入进程名称手动添加」直接添加进程名称。`n - 下方是「JetBrains IDE 应用进程列表」。`n - 你需要将你使用的 JetBrains IDE 应用进程添加进去,它会实时生效。`n - 如果不小心将其他应用添加了,需要双击下方列表中的应用进程将它移除。`n - 在 IDE 添加完成后,勾选「启用 JetBrains IDE 支持」,就可以在 IDE 中使用 InputTip 了。`n - 如果未生效,请检查是否完成「启用 JetBrains IDE 支持」中的所有操作步骤。`n - 你应该访问这些相关链接: InputTip 官网 Github Gitee`n`n2. 如何快速添加应用进程?`n - 每次双击应用进程后,会弹出操作窗口,需要选择添加/移除或取消`n - 如果你确定当前操作不需要取消,可以在操作窗口弹出后,按下空格键快速确认', addConfirm: "是否要添加", addConfirm2: "?", - addConfirm3: "注意: 如果此应用进程不是 JetBrains 系列 IDE 应用程序,你不应该添加它", - rmTopText: "2. 双击应用进程进行移除`n3. 如果有非 JetBrains 系列 IDE 应用进程被意外添加,请立即移除", - rmList: "以下列表是已经添加的 JetBrains 系列 IDE 应用程序", + addConfirm3: "如果它不是 JetBrains 系列 IDE 应用程序,你不能添加它`n如果不小心添加了,必须立即移除。", + addConfirm4: "此处的「添加」按钮会将它同步添加到白名单中。", rmConfirm: "是否要将", rmConfirm2: "移除?", rmConfirm3: "如果它是一个 JetBrains 系列 IDE 应用程序,不建议移除它。`n反之,如果它不是,请立即移除。", @@ -1637,6 +1826,11 @@ makeTrayMenu() { A_TrayMenu.Add() A_TrayMenu.Add("关于", fn_about) fn_about(*) { + if (gc.w.aboutGui) { + gc.w.aboutGui.Flash() + gc.w.aboutGui.Show() + return + } aboutGui := Gui("AlwaysOnTop") aboutGui.SetFont(fz, "微软雅黑") aboutGui.AddText(, "InputTip - 一个输入法状态(中文/英文/大写锁定)提示工具") @@ -1685,9 +1879,12 @@ makeTrayMenu() { btn := aboutGui.AddButton("Section w" Gui_width + aboutGui.MarginX * 2, "关闭") btn.Focus() btn.OnEvent("Click", fn_close) + aboutGui.OnEvent("Close", fn_close) fn_close(*) { aboutGui.Destroy() + gc.w.aboutGui := "" } + gc.w.aboutGui := aboutGui aboutGui.Show() } A_TrayMenu.Add("重启", fn_restart) @@ -1706,55 +1903,61 @@ makeTrayMenu() { } fn_common(tipList, handleFn) { - show() - show(deep := "") { + showGui() + showGui(deep := "") { + if (gc.w.%tipList.gui%) { + gc.w.%tipList.gui%.Flash() + gc.w.%tipList.gui%.Show() + return + } createGui(fn).Show() fn(x, y, w, h) { g := Gui("AlwaysOnTop") g.SetFont(fz, "微软雅黑") bw := w - g.MarginX * 2 + _gui := tipList.gui tab := g.AddTab3("-Wrap", tipList.tab) tab.UseTab(1) g.AddLink("Section cRed", tipList.tip) - gc.LV_add := g.AddListView("-LV0x10 -Multi r7 NoSortHdr Sort Grid w" bw, ["正在运行的应用进程列表", "窗口标题"]) - gc.LV_add.OnEvent("DoubleClick", fn_double_click) + gc.%_gui "_LV_add"% := g.AddListView("-LV0x10 -Multi r7 NoSortHdr Sort Grid w" bw, ["正在运行的应用进程列表", "窗口标题", "应用进程文件所在位置"]) + gc.%_gui "_LV_add"%.OnEvent("DoubleClick", fn_double_click) fn_double_click(LV, RowNumber) { handleClick(LV, RowNumber, "add", tipList) } value := ":" readIni(tipList.config, "") ":" temp := ":" DetectHiddenWindows deep - gc.LV_add.Opt("-Redraw") + gc.%_gui "_LV_add"%.Opt("-Redraw") for v in WinGetList() { try { exe_name := ProcessGetName(WinGetPID("ahk_id " v)) exe_str := ":" exe_name ":" if (!InStr(temp, exe_str) && !InStr(value, exe_str)) { temp .= exe_name ":" - gc.LV_add.Add(, exe_name, WinGetTitle("ahk_id " v)) + gc.%_gui "_LV_add"%.Add(, exe_name, WinGetTitle("ahk_id " v), WinGetProcessPath("ahk_id " v)) } } } - gc.LV_add.Opt("+Redraw") + gc.%_gui "_LV_add"%.Opt("+Redraw") DetectHiddenWindows 1 ; gc.title := g.AddText("Section w" bw, tipList.list) - ; gc.LV_rm := g.AddListView("xs IconSmall -LV0x10 -Multi r5 NoSortHdr Sort Grid w" bw " " tipList.color) - gc.LV_rm := g.AddListView("xs -LV0x10 -Multi r6 NoSortHdr Sort Grid w" bw / 2 " " tipList.color, [tipList.list]) + ; gc.%_gui "_LV_rm"% := g.AddListView("xs IconSmall -LV0x10 -Multi r5 NoSortHdr Sort Grid w" bw " " tipList.color) + gc.%_gui "_LV_rm"% := g.AddListView("xs -LV0x10 -Multi r6 NoSortHdr Sort Grid w" bw / 2 " " tipList.color, [tipList.list]) valueArr := StrSplit(readIni(tipList.config, ""), ":") temp := ":" - gc.LV_rm.Opt("-Redraw") + gc.%_gui "_LV_rm"%.Opt("-Redraw") for v in valueArr { if (Trim(v) && !InStr(temp, ":" v ":")) { - gc.LV_rm.Add(, v) + gc.%_gui "_LV_rm"%.Add(, v) temp .= v ":" } } - gc.LV_rm.Opt("+Redraw") - ; gc.title.Text := tipList.list "(" gc.LV_rm.GetCount() "项)" - gc.LV_rm.ModifyCol(1, "AutoHdr") - gc.LV_rm.OnEvent("DoubleClick", fn_dbClick) + gc.%_gui "_LV_rm"%.Opt("+Redraw") + ; gc.title.Text := tipList.list "(" gc.%_gui "_LV_rm"%.GetCount() "项)" + gc.%_gui "_LV_rm"%.ModifyCol(1, "AutoHdr") + gc.%_gui "_LV_rm"%.OnEvent("DoubleClick", fn_dbClick) fn_dbClick(LV, RowNumber) { handleClick(LV, RowNumber, "rm", tipList) } @@ -1775,32 +1978,74 @@ fn_common(tipList, handleFn) { g_1.AddLink("xs", tipList.%from "Confirm3"%) if (from = "add") { - g_1.AddButton("xs w" bw, "添加").OnEvent("Click", fn_add) - fn_add(*) { - g_1.Destroy() - gc.LV_add.Delete(RowNumber) - gc.LV_rm.Add(, RowText) - ; gc.title.Text := tipList.list "(" gc.LV_rm.GetCount() "项)" - config := tipList.config - value := readIni(config, "") - if (value) { - result := value ":" RowText - writeIni(config, value ":" RowText) - } else { - result := RowText - writeIni(config, RowText) + ; 需要同步添加到白名单 + flag := tipList.config = "JetBrains_list" && useWhiteList + if (flag && tipList.addConfirm4) { + g_1.AddLink("xs cRed", tipList.addConfirm4) + } + if (flag) { + _g := g_1.AddButton("xs w" bw, "添加") + _g.OnEvent("Click", fn_add_with_white_list) + _g.Focus() + fn_add_with_white_list(*) { + global app_show_state + _app_show_state := readIni("app_show_state", "") + if (!InStr(app_show_state, ":" RowText ":")) { + if (_app_show_state) { + _app_show_state .= ":" RowText + } else { + _app_show_state := RowText + } + app_show_state := ":" _app_show_state ":" + writeIni("app_show_state", _app_show_state) + } + g_1.Destroy() + gc.%_gui "_LV_add"%.Delete(RowNumber) + gc.%_gui "_LV_rm"%.Add(, RowText) + ; gc.title.Text := tipList.list "(" gc.%_gui "_LV_rm"%.GetCount() "项)" + config := tipList.config + value := readIni(config, "") + if (value) { + result := value ":" RowText + writeIni(config, value ":" RowText) + } else { + result := RowText + writeIni(config, RowText) + } + handleFn(result) + } + } else { + _g := g_1.AddButton("xs w" bw, "添加") + _g.OnEvent("Click", fn_add) + _g.Focus() + fn_add(*) { + g_1.Destroy() + gc.%_gui "_LV_add"%.Delete(RowNumber) + gc.%_gui "_LV_rm"%.Add(, RowText) + ; gc.title.Text := tipList.list "(" gc.%_gui "_LV_rm"%.GetCount() "项)" + config := tipList.config + value := readIni(config, "") + if (value) { + result := value ":" RowText + writeIni(config, value ":" RowText) + } else { + result := RowText + writeIni(config, RowText) + } + handleFn(result) } - handleFn(result) } } else { - g_1.AddButton("xs w" bw, "移除").OnEvent("Click", fn_rm) + _g := g_1.AddButton("xs w" bw, "移除") + _g.OnEvent("Click", fn_rm) + _g.Focus() } fn_rm(*) { g_1.Destroy() LV.Delete(RowNumber) ; gc.title.Text := tipList.list "(" LV.GetCount() "项)" try { - gc.LV_add.Add(, RowText, WinGetTitle("ahk_exe " RowText)) + gc.%_gui "_LV_add"%.Add(, RowText, WinGetTitle("ahk_exe " RowText)) } config := tipList.config value := readIni(config, "") @@ -1821,10 +2066,10 @@ fn_common(tipList, handleFn) { return g_1 } } - g.AddButton("Section yp w" bw / 2, "刷新上方的应用进程列表").OnEvent("Click", fn_refresh) + g.AddButton("Section yp w" bw / 2, "刷新应用进程列表").OnEvent("Click", fn_refresh) fn_refresh(*) { - g.Destroy() - show(deep) + fn_close() + showGui(deep) } g.AddButton("xs w" bw / 2, "通过输入进程名称手动添加").OnEvent("Click", fn_add_by_hand) fn_add_by_hand(*) { @@ -1832,16 +2077,26 @@ fn_common(tipList, handleFn) { addApp(v) { createGui(fn).Show() fn(x, y, w, h) { + if (gc.w.subGui) { + gc.w.subGui.Destroy() + gc.w.subGui := "" + } g_2 := Gui("AlwaysOnTop", "InputTip - 手动添加进程") g_2.SetFont(fz, "微软雅黑") bw := w - g_2.MarginX * 2 + + ; 需要同步添加到白名单 + flag := tipList.config = "JetBrains_list" && useWhiteList + if (flag && tipList.addConfirm4) { + g_2.AddText("cRed", tipList.addConfirm4) + } g_2.AddText(, "1. 进程名称应该是") g_2.AddText("yp cRed", "xxx.exe") g_2.AddText("yp", "这样的格式") g_2.AddText("xs", "2. 每一次只能添加一个") g_2.AddText("xs", "进程名称: ") g_2.AddEdit("yp vexe_name", "").Value := v - g_2.AddButton("xs w" bw, "确认添加").OnEvent("Click", yes) + g_2.AddButton("xs w" bw, "添加").OnEvent("Click", yes) yes(*) { exe_name := g_2.Submit().exe_name if (!RegExMatch(exe_name, "^.+\.\w{3}$")) { @@ -1851,7 +2106,9 @@ fn_common(tipList, handleFn) { g_2.SetFont(fz, "微软雅黑") bw := w - g_2.MarginX * 2 g_2.AddText(, "进程名称不符合格式要求,请重新输入") - g_2.AddButton("w" bw, "我知道了").OnEvent("click", close) + y := g_2.AddButton("w" bw, "我知道了") + y.OnEvent("click", close) + y.Focus() close(*) { g_2.Destroy() addApp(exe_name) @@ -1860,7 +2117,6 @@ fn_common(tipList, handleFn) { } return } - value := readIni(tipList.config, "") valueArr := StrSplit(value, ":") res := "" @@ -1888,12 +2144,26 @@ fn_common(tipList, handleFn) { return g_2 } } else { - gc.LV_rm.Add(, exe_name) + if (flag) { + global app_show_state + _app_show_state := readIni("app_show_state", "") + if (!InStr(app_show_state, ":" exe_name ":")) { + if (_app_show_state) { + _app_show_state .= ":" exe_name + } else { + _app_show_state := exe_name + } + app_show_state := ":" _app_show_state ":" + writeIni("app_show_state", _app_show_state) + } + } + gc.%_gui "_LV_rm"%.Add(, exe_name) result := res exe_name writeIni(tipList.config, result) handleFn(result) } } + gc.w.subGui := g_2 return g_2 } } @@ -1902,6 +2172,10 @@ fn_common(tipList, handleFn) { fn_clear(*) { createGui(fn).Show() fn(x, y, w, h) { + if (gc.w.subGui) { + gc.w.subGui.Destroy() + gc.w.subGui := "" + } g_3 := Gui("AlwaysOnTop") g_3.SetFont(fz, "微软雅黑") bw := w - g_3.MarginX * 2 @@ -1910,35 +2184,43 @@ fn_common(tipList, handleFn) { g_3.AddButton("xs w" bw, "取消").OnEvent("Click", no) yes(*) { g_3.Destroy() - gc.LV_rm.Delete() + gc.%_gui "_LV_rm"%.Delete() writeIni(tipList.config, "") handleFn("") - g.Destroy() - show(deep) + fn_close() + showGui(deep) } no(*) { g_3.Destroy() } + gc.w.subGui := g_3 return g_3 } } if (deep) { g.AddButton("xs w" bw / 2, "显示更少进程(仅包含已经打开的窗口)").OnEvent("Click", fn_less_window) fn_less_window(*) { - g.Destroy() - show("") + fn_close() + showGui("") } } else { g.AddButton("xs w" bw / 2, "显示更多进程(包含后台和隐藏窗口)").OnEvent("Click", fn_more_window) fn_more_window(*) { - g.Destroy() - show(1) + fn_close() + showGui(1) } } - gc.LV_add.ModifyCol(1, "AutoHdr") - gc.LV_add.ModifyCol(2, "AutoHdr") + gc.%_gui "_LV_add"%.ModifyCol(1, "AutoHdr") + gc.%_gui "_LV_add"%.ModifyCol(2, "AutoHdr") + gc.%_gui "_LV_add"%.ModifyCol(3, "AutoHdr") tab.UseTab(2) g.AddLink(, tipList.about) + g.OnEvent("Close", fn_close) + fn_close(*) { + g.Destroy() + gc.w.%tipList.gui% := "" + } + gc.w.%tipList.gui% := g return g } } @@ -1946,15 +2228,17 @@ fn_common(tipList, handleFn) { fn_white_list(*) { fn_common({ + gui: "whiteListGui", config: "app_show_state", tab: ["管理白名单", "关于"], tip: "你首先应该点击上方的 「关于」查看具体的操作说明。", list: "符号显示白名单", color: "cGreen", - about: '如何使用这个管理面板?`n`n- 最上方的列表页显示的是当前系统正在运行的应用进程(仅包含有前台窗口的)`n- 双击列表中任意应用进程,就可以将其添加到「符号显示白名单」中。`n- 如果需要更多的进程,请点击右下角的「显示更多进程」以显示后台和隐藏进程。`n- 也可以点击右下角的「通过输入进程名称手动添加」直接添加进程名称。`n- 下方是「符号显示白名单」应用进程列表,如果使用白名单机制,它将生效。`n- 双击列表中任意应用进程,就可以将它移除。`n`n- 白名单机制: 只有在白名单中的应用进程窗口才会显示符号。`n- 建议使用白名单机制,这样可以精确控制哪些应用进程窗口需要显示符号。`n- 使用白名单机制,只需要添加常用的窗口,可以减少一些特殊窗口的兼容性问题。`n- 如果选择了白名单机制,请及时添加你需要使用的应用进程到白名单中。`n- 如果勾选了「启用 JetBrains IDE 支持」,还需要将相关 IDE 进程添加到白名单中。', + about: '1. 如何使用这个管理面板?`n - 最上方的列表页显示的是当前系统正在运行的应用进程(仅前台窗口)`n - 双击列表中任意应用进程,就可以将其添加到「符号显示白名单」中。`n - 如果需要更多的进程,请点击右下角的「显示更多进程」以显示后台和隐藏进程。`n - 也可以点击右下角的 「通过输入进程名称手动添加」直接添加进程名称。`n - 下方是「符号显示白名单」应用进程列表,如果使用白名单机制,它将生效。`n - 双击列表中任意应用进程,就可以将它移除。`n`n - 白名单机制 : 只有在白名单中的应用进程窗口才会显示符号。`n - 建议使用白名单机制,这样可以精确控制哪些应用进程窗口需要显示符号。`n - 使用白名单机制,只需要添加常用的窗口,可以减少一些特殊窗口的兼容性问题。`n - 如果选择了白名单机制,请及时添加你需要使用的应用进程到白名单中。`n`n2. 如何快速添加应用进程?`n - 每次双击应用进程后,会弹出操作窗口,需要选择添加/移除或取消`n - 如果你确定当前操作不需要取消,可以在操作窗口弹出后,按下空格键快速确认', addConfirm: "是否要将", addConfirm2: "添加到「符号显示白名单」中?", addConfirm3: "添加后,白名单机制下,在此应用窗口中时,会显示符号(图片/方块/文本符号)", + addConfirm4: "", rmConfirm: "是否要将", rmConfirm2: "从「符号显示白名单」中移除?", rmConfirm3: "移除后,白名单机制下,在此应用窗口中时,不会显示符号(图片/方块/文本符号)", diff --git a/src/v2/utils/verify-file.ahk b/src/v2/utils/verify-file.ahk index d5098bd..2b3b124 100644 --- a/src/v2/utils/verify-file.ahk +++ b/src/v2/utils/verify-file.ahk @@ -55,12 +55,7 @@ waitFileInstall(path, isExit := 1) { * - 当配置文件不存在时,选择是否修改鼠标样式 */ checkIni() { - if (FileExist("InputTip.ini")) { - c := IniRead("InputTip.ini", "config-v2") - if (InStr(c, "isStartUp") && !InStr(c, "JetBrains_list")) { - writeIni("JetBrains_list", "WebStorm64.exe:DataGrip64.exe:PhpStorm64.exe:PyCharm64.exe:Rider64.exe:CLion64.exe:RubyMine64.exe:GoLand64.exe:Idea64.exe:DataSpell64.exe") - } - } else { + if (!FileExist("InputTip.ini")) { ; 是否使用白名单机制,如果是第一次使用,就直接使用白名单机制 useWhiteList := readIni("useWhiteList", 1) @@ -127,9 +122,11 @@ checkIni() { bw := w - g.MarginX * 2 g.AddText("cRed", "对于符号显示,InputTip 现在默认使用白名单机制。") - g.AddText("cRed", "白名单机制: 只有在白名单中的应用进程窗口会显示符号。") + g.AddLink("cRed", '白名单机制 : 只有在白名单中的应用进程窗口会显示符号。') g.AddText(, "建议立即添加应用进程到白名单中。") - g.AddButton("w" bw, "【是】现在就添加应用进程").OnEvent("Click", add_white_list) + _c := g.AddButton("w" bw, "【是】现在就添加应用进程") + _c.OnEvent("Click", add_white_list) + _c.Focus() g.AddButton("w" bw, "【否】不了,等一下再添加").OnEvent("Click", no) add_white_list(*) { g.Destroy() diff --git a/src/v2/version.txt b/src/v2/version.txt index d422cdf..cb5e764 100644 --- a/src/v2/version.txt +++ b/src/v2/version.txt @@ -1 +1 @@ -2.28.4 +2.28.5