diff --git a/README.md b/README.md
index 729ab34..8e7199f 100644
--- a/README.md
+++ b/README.md
@@ -50,7 +50,7 @@
> - [查看 v1 老版本](./src/v1/README.md) (此版本已经没啥用了,不再更新)
-**如果 `InputTip` 对你有所帮助,请考虑给它一个 Star ⭐**
+[**如果 `InputTip` 对你有所帮助,请考虑给它一个 Star ⭐**](#stars)
### 新的变化
@@ -143,6 +143,10 @@
> [!Tip]
> 你可以自行查看源代码并编译 `InputTip`
+> [!Warning]
+>
+> 如果修改了项目代码,需要先编译 `InputTip.JAB.JetBrains.ahk`,再编译 `InputTip.ahk`
+
1. 克隆项目仓库到本地
```shell
@@ -323,6 +327,7 @@
- 如果正在使用 **讯飞**输入法,你需要选择它
- `手心输入法`
- 如果你正在使用 **手心**输入法,你需要选择它
+ - 兼容性一般,因为获取到的输入法状态可能有误,导致基于此的相关功能都可能有问题。
- `自定义`
- [关于设置输入法模式中的自定义](https://inputtip.pages.dev/FAQ/about-input-mode-custom)
@@ -343,8 +348,19 @@
- 之后看到了 [RedDot - Autumn-one](https://github.com/Autumn-one/RedDot) 和 [language-indicator - yakunins](https://github.com/yakunins/language-indicator) 的设计,通过不同颜色加上小符号来判断不同输入法状态
- InputTip 也参照了这样的设计,因为这样的实现很简单,其实就是 [InputTip v1](./src/v1/README.md) 中带文字的方块符号,去掉文字,加上不同的背景颜色
+### Stars
+
+**如果 `InputTip` 对你有所帮助,请考虑给它一个 Star ⭐**
+
+
+
+
+
### 赞赏支持
-
+
![赞赏支持](https://abgox.pages.dev/support.png)
diff --git a/src/v2/CHANGELOG.md b/src/v2/CHANGELOG.md
index 612bd54..3c57379 100644
--- a/src/v2/CHANGELOG.md
+++ b/src/v2/CHANGELOG.md
@@ -4,6 +4,14 @@
- 没有特别说明的版本都是修复问题
+## 2.28.6
+
+- 完善了自动切换的逻辑
+- 修复了当设置快捷键切换状态后,频繁按下多次快捷键,状态切换有误的问题
+- 优化了「指定窗口自动切换状态」配置菜单
+ - 当添加应用进程时,如果白名单中不存在,则同步添加到白名单中
+- 其他的修复和优化
+
## 2.28.5
- 限制同一个配置菜单只能存在一个,避免出现多个相同菜单,导致修改冲突
@@ -39,16 +47,6 @@
> [!warning]
>
> `v2.28.0` 会默认使用白名单机制
->
-> 由于配置迁移的问题,旧版本更新后,需要根据情况手动调整。(在 `v2.28.1` 中已修复)
->
-> - 使用新的白名单机制: `托盘菜单` => `符号显示黑/白名单` => `设置「白」名单`
-> - 继续使用黑名单机制: `托盘菜单` => `符号显示黑/白名单` => `使用「黑」名单`
-> - 推荐使用白名单机制,精确指定应用进程,可以减少一些特殊窗口的兼容性问题
->
-> 白名单机制下,你需要先将 `InputTip.exe` 加入白名单,符号相关的配置更改才会实时生效
->
-> 如果是通过源代码运行 `InputTip.ahk`,就需要将启动 `InputTip.ahk` 的 AHK 进程加入白名单
- 托盘菜单中的配置项变化
- `暂停软件运行` 修改为 `暂停/运行`
diff --git a/src/v2/InputTip.JAB.JetBrains.exe b/src/v2/InputTip.JAB.JetBrains.exe
index 2fcb6ba..0baf881 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 c0138de..cd707a1 100644
--- a/src/v2/InputTip.ahk
+++ b/src/v2/InputTip.ahk
@@ -64,7 +64,6 @@ gc := {
}
; 配置菜单的字体大小
-
fz := "s12"
if (A_ScreenHeight < 1000 || A_ScreenWidth < 2000) {
fz := "s10"
diff --git a/src/v2/utils/IME.ahk b/src/v2/utils/IME.ahk
index ec5d5bd..4041a9d 100644
--- a/src/v2/utils/IME.ahk
+++ b/src/v2/utils/IME.ahk
@@ -135,8 +135,11 @@ class IME {
/**
* 判断当前输入法状态是否为中文
- * 需要: DetectHiddenWindows 1
* @returns {Boolean} 输入法是否为中文
+ * @example
+ * DetectHiddenWindows 1 ; 前置条件(不为1,可能判断有误)
+ * ;...
+ * MsgBox isCN()
*/
isCN() {
return IME.GetInputMode().isCN
@@ -145,8 +148,13 @@ isCN() {
/**
* 将输入法状态切换为中文
* @Tip 外部必须提供变量 useShift(是否使用 Shift 切换输入法状态)
+ * @example
+ * SetStoreCapsLockMode 0 ; 前置条件,确保大写锁定可切换
+ * ; ...
+ * switch_CN()
*/
switch_CN(*) {
+ isShift := GetKeyState("Shift", "P")
if (GetKeyState("CapsLock", "T")) {
SendInput("{CapsLock}")
}
@@ -155,15 +163,25 @@ switch_CN(*) {
IME.SetInputMode(1)
}
}
- if (!GetKeyState("Shift", "P") && !isCN()) {
- SendInput("{Shift}")
+ Sleep(50)
+ if (!isShift && !isCN()) {
+ SendInput("{LShift}")
+ Sleep(50)
+ if (!isCN()) {
+ SendInput("{RShift}")
+ }
}
}
/**
* 将输入法状态切换为英文
* @Tip 外部必须提供变量 useShift(是否使用 Shift 切换输入法状态)
+ * @example
+ * SetStoreCapsLockMode 0 ; 前置条件,确保大写锁定可切换
+ * ; ...
+ * switch_EN()
*/
switch_EN(*) {
+ isShift := GetKeyState("Shift", "P")
if (GetKeyState("CapsLock", "T")) {
SendInput("{CapsLock}")
}
@@ -172,12 +190,21 @@ switch_EN(*) {
IME.SetInputMode(0)
}
}
- if (!GetKeyState("Shift", "P") && isCN()) {
- SendInput("{Shift}")
+ Sleep(50)
+ if (!isShift && isCN()) {
+ SendInput("{LShift}")
+ Sleep(50)
+ if (isCN()) {
+ SendInput("{RShift}")
+ }
}
}
/**
* 将输入法状态切换为大写锁定
+ * @example
+ * SetStoreCapsLockMode 0 ; 前置条件,确保大写锁定可切换
+ * ; ...
+ * switch_Caps()
*/
switch_Caps(*) {
if (!GetKeyState("CapsLock", "T")) {
diff --git a/src/v2/utils/options.ahk b/src/v2/utils/options.ahk
index 355399b..a2b1006 100644
--- a/src/v2/utils/options.ahk
+++ b/src/v2/utils/options.ahk
@@ -9,9 +9,8 @@ ListLines 0
KeyHistory 0
DetectHiddenWindows 1
InstallKeybdHook
-InstallMouseHook
CoordMode 'Mouse', 'Screen'
SetStoreCapsLockMode 0
-;@AHK2Exe-SetVersion 2.28.5
-currentVersion := "2.28.5"
+;@AHK2Exe-SetVersion 2.28.6
+currentVersion := "2.28.6"
diff --git a/src/v2/utils/tray-menu.ahk b/src/v2/utils/tray-menu.ahk
index f4adbf1..b9b0466 100644
--- a/src/v2/utils/tray-menu.ahk
+++ b/src/v2/utils/tray-menu.ahk
@@ -200,6 +200,7 @@ makeTrayMenu() {
g.OnEvent("Close", yes)
yes(*) {
g.Destroy()
+ last := mode + 1
try {
gc.mode.Value := mode + 1
}
@@ -429,6 +430,7 @@ makeTrayMenu() {
global useWhiteList := value
restartJetBrains()
}
+ g.AddEdit("xs Disabled", "如果使用「黑」名单,你需要承担未知的可能存在的窗口兼容性代价")
_c := g.AddButton("xs w" bw, "设置「白」名单")
_c.OnEvent("Click", set_white_list)
_c.Focus()
@@ -1478,6 +1480,20 @@ makeTrayMenu() {
} else {
writeIni(config, RowText)
}
+
+ ; 同步添加到白名单
+ 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)
+ }
+
global app_CN := ":" readIni('app_CN', '') ":"
global app_EN := ":" readIni('app_EN', '') ":"
global app_Caps := ":" readIni('app_Caps', '') ":"
@@ -1489,6 +1505,7 @@ makeTrayMenu() {
g_1.AddLink(, "要将进程")
g_1.AddLink("yp cRed", RowText)
g_1.AddLink("yp", "添加到哪一个自动切换列表中?")
+ g_1.AddLink("xs cRed", "如果选择添加且此应用不在白名单中,则会同步添加到白名单中")
fn_CN(*) {
_handle("CN")
}
@@ -1640,7 +1657,7 @@ makeTrayMenu() {
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 - 添加完成后,会在下方对应列表中显示,并实时生效。`n - 你也可以双击下方列表中的其中一个应用进程进行同样的操作。")
g.OnEvent("Close", fn_close)
fn_close(*) {