From 897887d8f2c600a25e30ce79e7a74d4217a3c338 Mon Sep 17 00:00:00 2001 From: abgox Date: Sun, 12 Jan 2025 09:12:46 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=9B=B4=E6=96=B0=E7=89=88=E6=9C=AC=20?= =?UTF-8?q?2.30.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/v2/CHANGELOG.md | 14 +- src/v2/InputTip.JAB.JetBrains.exe | Bin 1355776 -> 1355776 bytes src/v2/InputTip.ahk | 360 ++++++++++++++++-------------- src/v2/menu/JAB.ahk | 3 +- src/v2/menu/app-offset.ahk | 21 +- src/v2/menu/bw-list.ahk | 53 ++++- src/v2/menu/check-update.ahk | 7 +- src/v2/menu/config.ahk | 71 +++++- src/v2/menu/cursor-mode.ahk | 52 +++-- src/v2/menu/input-mode.ahk | 45 ++-- src/v2/menu/pause-key.ahk | 18 +- src/v2/menu/startup.ahk | 6 +- src/v2/menu/switch-key.ahk | 11 +- src/v2/menu/switch-window.ahk | 29 ++- src/v2/menu/tray-menu.ahk | 45 ++-- src/v2/utils/app-list.ahk | 37 +-- src/v2/utils/options.ahk | 4 +- src/v2/utils/var.ahk | 3 +- src/v2/utils/verify-file.ahk | 2 +- src/v2/version.txt | 2 +- 20 files changed, 468 insertions(+), 315 deletions(-) diff --git a/src/v2/CHANGELOG.md b/src/v2/CHANGELOG.md index 3c22b5b..b9be3c3 100644 --- a/src/v2/CHANGELOG.md +++ b/src/v2/CHANGELOG.md @@ -1,9 +1,19 @@ # v2 版本更新日志 -- 注意: 如果你的网络环境无法访问 [官网](https://inputtip.pages.dev),`InputTip.exe` 也将无法检测到版本更新,你可能需要额外关注项目仓库中是否有版本更新 - - 没有特别说明的版本都是修复问题 +## 2.30.0 + +- 在 `更改配置` 中的 `其他杂项` 中添加了 `实时显示当前激活的窗口进程信息` +- 为各个列表添加了个数统计 +- 移除了软件内部的禁用名单 + - 禁用名单中的应用进程不是所有系统环境都有问题的,统一禁用不合理 + - 如果你仍继续使用黑名单,也应该由你自行添加 +- 当选择 `使用「黑」名单` 时,会弹出警告窗口提醒 +- 修复了 `设置光标获取模式` 中的一些问题 +- 优化了许多菜单的显示和操作逻辑 +- 其他的修复和优化 + ## 2.29.0 - 添加了 `设置光标获取模式` diff --git a/src/v2/InputTip.JAB.JetBrains.exe b/src/v2/InputTip.JAB.JetBrains.exe index 59b53abaff8379678f9e7fe6e576eb05a4e84c2b..52f62c375ab5676b2b3b024351cf198734f06271 100644 GIT binary patch delta 738 zcmZp85Y+G>Xu}>xrUN>g_c2<5=;mKc?Z229ffz(H12GE_vjQ<25VHd@2M}`tF&7YX z12GQ}^8zs+5c31E01yiTvC#HkOu|vE_2r=q3{O}Xz~GFrD1!))1>-*e^6ilL3MQfq zK1lo=H2w}WK8vX+!vZFRc}vVi86;T|d<_PM?Uy@*b51ZB8*FzB6!|Ey-7r}slxcc< zs)*zElc^%7m03Le{k^9%c8SPsf7dC(!90Cuj|lhltX>hW?LxgG5z@j840~DL|6^ca zWRPP3S_K4h(`#3Vv@$YGXI?214y2-2ipUExFc>lDF&Hx#07(Oos_ET8VW8~ll_JtW z>i9|#O>SiA-z!C|f#T+?MACuO{8eDZ`@z)q`>RA0S?dEFU0gi<+#@2O3_A1c-RW#0 Mnte`wXac130Ri{Pl>h($ delta 713 zcmZp85Y+G>Xu}>xCI-FD`xvc2bn`E!_FqhlKn$XpftUq|S%H`hh}nUd1Bf|+m6 z#9xEP|AEGLF%xB2z=SaGiG?VGBrAfi!N9Qna))rv2__@U?T&#W9|h`DGK&+Fa#F1n zqPdiUGg5PMTq_Dvi!xL5l2bkMi%axUD^itofKnxiMJ2wed8OE;%L|HODm|P^Gjmc> ziy~kG<*6l=1*!3+1u2OosW8ES{E~p2#LCqAB6N`=GZPFU-^{#Btbz!&j(I+rdD$>U z!5N7~sc;u0=VTV7WF{6>>K5b|m4LhpRTrzX-7rZcjERwJdV7k9BO}-L6DcC6mD! DllCall("FreeLibrary", "ptr", _) } - static IID_IAccessible := guidFromString("{618736e0-3c3d-11cf-810c-00aa00389b71}") - if !DllCall("oleacc\AccessibleObjectFromWindow", "ptr", hwnd, "uint", 0xfffffff8, "ptr", IID_IAccessible, "ptr*", accCaret := ComValue(13, 0), "int") { - if A_PtrSize == 8 { - varChild := Buffer(24, 0) - NumPut("ushort", 3, varChild) - hr := ComCall(22, accCaret, "int*", &x := 0, "int*", &y := 0, "int*", &w := 0, "int*", &h := 0, "ptr", varChild, "int") - } - else { - hr := ComCall(22, accCaret, "int*", &x := 0, "int*", &y := 0, "int*", &w := 0, "int*", &h := 0, "int64", 3, "int64", 0, "int") - } - if !hr { - pt := x | y << 32 - DllCall("ScreenToClient", "ptr", hwnd, "int64*", &pt) - left := pt & 0xffffffff - top := pt >> 32 - right := left + w - bottom := top + h - scaleRect(getWindowScale(hwnd), &left, &top, &right, &bottom) - clientToScreenRect(hwnd, &left, &top, &right, &bottom) - return true + try { + if !hOleacc := DllCall("LoadLibraryW", "str", "oleacc.dll", "ptr") + return false + hOleacc := { Ptr: hOleacc, __Delete: (_) => DllCall("FreeLibrary", "ptr", _) } + static IID_IAccessible := guidFromString("{618736e0-3c3d-11cf-810c-00aa00389b71}") + if !DllCall("oleacc\AccessibleObjectFromWindow", "ptr", hwnd, "uint", 0xfffffff8, "ptr", IID_IAccessible, "ptr*", accCaret := ComValue(13, 0), "int") { + if A_PtrSize == 8 { + varChild := Buffer(24, 0) + NumPut("ushort", 3, varChild) + hr := ComCall(22, accCaret, "int*", &x := 0, "int*", &y := 0, "int*", &w := 0, "int*", &h := 0, "ptr", varChild, "int") + } + else { + hr := ComCall(22, accCaret, "int*", &x := 0, "int*", &y := 0, "int*", &w := 0, "int*", &h := 0, "int64", 3, "int64", 0, "int") + } + if !hr { + pt := x | y << 32 + DllCall("ScreenToClient", "ptr", hwnd, "int64*", &pt) + left := pt & 0xffffffff + top := pt >> 32 + right := left + w + bottom := top + h + scaleRect(getWindowScale(hwnd), &left, &top, &right, &bottom) + clientToScreenRect(hwnd, &left, &top, &right, &bottom) + return true + } } + return false } - return false + return 0 } getCaretPosFromUIA() { @@ -400,7 +412,7 @@ end: bottom := top + Round(rects[3]) return true } - return false + return 0 } getCaretPosFromWpfCaret() { @@ -436,150 +448,153 @@ end: getRect(rect, &left, &top, &right, &bottom) return true } - return false + return 0 } getCaretPosFromHook(flag) { - static WM_GET_CARET_POS := DllCall("RegisterWindowMessageW", "str", "WM_GET_CARET_POS", "uint") - if !tid := DllCall("GetWindowThreadProcessId", "ptr", hwnd, "ptr*", &pid := 0, "uint") - return false - if (flag) { - ; ! 有兼容性问题的 dll 调用,部分应用会因为它触发意外错误 - ; ! 如: 崩溃,自动复制/输入/删除/等 - ; Update caret position - try { - SendMessage(0x010f, 0, 0, hwnd) ; WM_IME_COMPOSITION + try { + static WM_GET_CARET_POS := DllCall("RegisterWindowMessageW", "str", "WM_GET_CARET_POS", "uint") + if !tid := DllCall("GetWindowThreadProcessId", "ptr", hwnd, "ptr*", &pid := 0, "uint") + return false + if (flag) { + ; ! 有兼容性问题的 dll 调用,部分应用会因为它触发意外错误 + ; ! 如: 崩溃,自动复制/输入/删除/等 + ; Update caret position + try { + SendMessage(0x010f, 0, 0, hwnd) ; WM_IME_COMPOSITION + } } - } - ; PROCESS_CREATE_THREAD | PROCESS_QUERY_INFORMATION | PROCESS_VM_OPERATION | PROCESS_VM_WRITE | PROCESS_VM_READ - if !hProcess := DllCall("OpenProcess", "uint", 1082, "int", false, "uint", pid, "ptr") - return false - hProcess := { Ptr: hProcess, __Delete: (_) => DllCall("CloseHandle", "ptr", _) } - - isX64 := isX64Process(hProcess) - if isX64 && A_PtrSize == 4 - return false - if !moduleBaseMap := getModulesBases(hProcess, ["kernel32.dll", "user32.dll", "combase.dll"]) - return false - if isX64 { - static shellcode64 := compile(true) - shellcode := shellcode64 - } - else { - static shellcode32 := compile(false) - shellcode := shellcode32 - } - if !mem := DllCall("VirtualAllocEx", "ptr", hProcess, "ptr", 0, "ptr", shellcode.Size, "uint", 0x1000, "uint", 0x40, "ptr") - return false - mem := { Ptr: mem, __Delete: (_) => DllCall("VirtualFreeEx", "ptr", hProcess, "ptr", _, "uptr", 0, "uint", 0x8000) } - link(isX64, shellcode, mem.Ptr, moduleBaseMap["user32.dll"], moduleBaseMap["combase.dll"], hwnd, tid, WM_GET_CARET_POS, &pThreadProc, &pRect) + ; PROCESS_CREATE_THREAD | PROCESS_QUERY_INFORMATION | PROCESS_VM_OPERATION | PROCESS_VM_WRITE | PROCESS_VM_READ + if !hProcess := DllCall("OpenProcess", "uint", 1082, "int", false, "uint", pid, "ptr") + return false + hProcess := { Ptr: hProcess, __Delete: (_) => DllCall("CloseHandle", "ptr", _) } - if !DllCall("WriteProcessMemory", "ptr", hProcess, "ptr", mem, "ptr", shellcode, "uptr", shellcode.Size, "ptr", 0) - return false - DllCall("FlushInstructionCache", "ptr", hProcess, "ptr", mem, "uptr", shellcode.Size) + isX64 := isX64Process(hProcess) + if isX64 && A_PtrSize == 4 + return false + if !moduleBaseMap := getModulesBases(hProcess, ["kernel32.dll", "user32.dll", "combase.dll"]) + return false + if isX64 { + static shellcode64 := compile(true) + shellcode := shellcode64 + } + else { + static shellcode32 := compile(false) + shellcode := shellcode32 + } + if !mem := DllCall("VirtualAllocEx", "ptr", hProcess, "ptr", 0, "ptr", shellcode.Size, "uint", 0x1000, "uint", 0x40, "ptr") + return false + mem := { Ptr: mem, __Delete: (_) => DllCall("VirtualFreeEx", "ptr", hProcess, "ptr", _, "uptr", 0, "uint", 0x8000) } + link(isX64, shellcode, mem.Ptr, moduleBaseMap["user32.dll"], moduleBaseMap["combase.dll"], hwnd, tid, WM_GET_CARET_POS, &pThreadProc, &pRect) - if !hThread := DllCall("CreateRemoteThread", "ptr", hProcess, "ptr", 0, "uptr", 0, "ptr", pThreadProc, "ptr", mem, "uint", 0, "uint*", &remoteTid := 0, "ptr") - return false - hThread := { Ptr: hThread, __Delete: (_) => DllCall("CloseHandle", "ptr", _) } + if !DllCall("WriteProcessMemory", "ptr", hProcess, "ptr", mem, "ptr", shellcode, "uptr", shellcode.Size, "ptr", 0) + return false + DllCall("FlushInstructionCache", "ptr", hProcess, "ptr", mem, "uptr", shellcode.Size) - if msgWaitForSingleObject(hThread) - return false - if !DllCall("GetExitCodeThread", "ptr", hThread, "uint*", exitCode := 0) || exitCode !== 0 - return false + if !hThread := DllCall("CreateRemoteThread", "ptr", hProcess, "ptr", 0, "uptr", 0, "ptr", pThreadProc, "ptr", mem, "uint", 0, "uint*", &remoteTid := 0, "ptr") + return false + hThread := { Ptr: hThread, __Delete: (_) => DllCall("CloseHandle", "ptr", _) } - rect := Buffer(16) - if !DllCall("ReadProcessMemory", "ptr", hProcess, "ptr", pRect, "ptr", rect, "uptr", rect.Size, "uptr*", &bytesRead := 0) || bytesRead !== rect.Size - return false - getRect(rect, &left, &top, &right, &bottom) - scaleRect(getWindowScale(hwnd), &left, &top, &right, &bottom) - return true + if msgWaitForSingleObject(hThread) + return false + if !DllCall("GetExitCodeThread", "ptr", hThread, "uint*", exitCode := 0) || exitCode !== 0 + return false - static isX64Process(hProcess) { - DllCall("IsWow64Process", "ptr", hProcess, "int*", &isWow64 := 0) - if isWow64 + rect := Buffer(16) + if !DllCall("ReadProcessMemory", "ptr", hProcess, "ptr", pRect, "ptr", rect, "uptr", rect.Size, "uptr*", &bytesRead := 0) || bytesRead !== rect.Size return false - if A_PtrSize == 8 - return true - DllCall("IsWow64Process", "ptr", DllCall("GetCurrentProcess", "ptr"), "int*", &isWow64) - return isWow64 - } + getRect(rect, &left, &top, &right, &bottom) + scaleRect(getWindowScale(hwnd), &left, &top, &right, &bottom) + return true - static getModulesBases(hProcess, modules) { - hModules := Buffer(A_PtrSize * 350) - if !DllCall("K32EnumProcessModulesEx", "ptr", hProcess, "ptr", hModules, "uint", hModules.Size, "uint*", &needed := 0, "uint", 3) - return - moduleBaseMap := Map() - moduleBaseMap.CaseSense := false - for v in modules - moduleBaseMap[v] := 0 - cnt := modules.Length - loop Min(350, needed) { - hModule := NumGet(hModules, A_PtrSize * (A_Index - 1), "ptr") - VarSetStrCapacity(&name, 12) - if DllCall("K32GetModuleBaseNameW", "ptr", hProcess, "ptr", hModule, "str", &name, "uint", 13) { - if moduleBaseMap.Has(name) { - moduleInfo := Buffer(24) - if !DllCall("K32GetModuleInformation", "ptr", hProcess, "ptr", hModule, "ptr", moduleInfo, "uint", moduleInfo.Size) - return - if !base := NumGet(moduleInfo, "ptr") - return - moduleBaseMap[name] := base - cnt-- - } - } - } until cnt == 0 - if cnt == 0 - return moduleBaseMap - } + static isX64Process(hProcess) { + DllCall("IsWow64Process", "ptr", hProcess, "int*", &isWow64 := 0) + if isWow64 + return false + if A_PtrSize == 8 + return true + DllCall("IsWow64Process", "ptr", DllCall("GetCurrentProcess", "ptr"), "int*", &isWow64) + return isWow64 + } - static compile(x64) { - if x64 - shellcodeBase64 := "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABrnppSh2UjT6uenH1oPjxQAeiAqiEg0hGT4ABgsGe4blNldFdpbmRvd3NIb29rRXhXAAAAVW5ob29rV2luZG93c0hvb2tFeABDYWxsTmV4dEhvb2tFeAAAAAAAAFNlbmRNZXNzYWdlVGltZW91dFcAQ29DcmVhdGVJbnN0YW5jZQAAAAAAAAAASIlcJAhIiXQkEFdIg+wgSYvYSIvyi/mFyXgjSIXbdB6LBQb///9BOUAQdRJIjQ3d/v//6JgBAACJBfL+//9Iiw3L/v//SI0VdP///+jnAgAASIXAdRBIi1wkMEiLdCQ4SIPEIF/DTIvLTIvGi9czyUiLXCQwSIt0JDhIg8QgX0j/4MzMzMzMzDPAw8zMzMzMQFNWSIPsSIvySIvZSIXJdQy4VwAHgEiDxEheW8NIi0kISI1UJGBIiVQkKEG4/////0iNVCQwSIl8JEAz/0iJVCQgiXwkYIvWSIsBRI1PAf9QKIXAeHJIOXwkMHRrOXwkYHRlSItLCEiNVCR4SIl8JHhIiwH/UEiL+IXAeDJIi0wkeEiFyXQoSIsBSI1UJHBMi0QkMEyNSxBIiVQkIIvW/1AgSItMJHiL+EiLAf9QEEiLTCQwSIsB/1AQi8dIi3wkQEiDxEheW8NIi3wkQLgBAAAASIPESF5bw8zMzMzMzMxIhcl0VEiF0nRPTYXAdEpIiwJIhcB1HUi4wAAAAAAAAEZIOUIIdCxJxwAAAAAAuAJAAIDDSbkD6ICqISDSEUk7wXXkSLiT4ABgsGe4bkg5Qgh11EmJCDPAw7hXAAeAw8xAU0iD7EBIi9lIjZHYAAAASItJCOhPAQAASIXAdQu4AQAAAEiDxEBbwzPJx0QkWAEAAABIjVQkaEiJTCRoSIlUJCBMjUt4M9JIiUwkYEiJTCQwiUwkUEiNS2hEjUIX/9CFwA+I7wAAAEiLTCRoSIXJD4ThAAAASIsBSI1UJFD/UBiFwA+IhQAAAEiLTCRoSI1UJGBIiwH/UDiFwHhxSItMJGBIhcl0bEiLAUiNVCQw/1AwhcB4WEiLTCQwSIXJdGZIjUNISIlLMEiJQyhMjUMoSI0Vyf7//0G5AwAAAEiJEEiNBdH9//9IiUNQSI1UJFhIiUNYSI0Fxf3//0iJQ2BIiwFIiVQkIItUJFD/UBhIi0wkYEiLVCQwSIXSdA5IiwJIi8r/UBBIi0wkYEiFyXQGSIsB/1AQSItMJGhIhcl0BkiLAf9QEItEJFj32BvAg+AESIPEQFvDuAQAAABIg8RAW8PMzMzMzMxIiVwkCEiJbCQQSIl0JBhIiXwkIEyL2kyL0UiFyXRwSIXSdGtIY0E8g7wIjAAAAAB0XYuMCIgAAACFyXRSRYtMCiBJjQQKi3AkTQPKi2gcSQPyi3gYSQPqD7YaRTPA/89BixFJA9I6GnUZD7bLSYvDSSvThMl0Lw+2SAFI/8A6DAJ08EH/wEmDwQREO8d20TPASItcJAhIi2wkEEiLdCQYSIt8JCDDSWPAD7cMRotEjQBJA8Lr28zMSIlcJAhIiWwkEEiJdCQYSIl8JCBBVkiD7EBIixlIjZGIAAAASIv5SIvL6Bn///9IjZfEAAAASIvLSIvw6Af///9IjZecAAAASIvLSIvo6PX+//9Mi/BIhfZ0ZUiF7XRgSIXAdFtEi08YSI0VoPv//0UzwEGNSAT/1kiL8EiFwHUFjUYC6z+LVxwzwEiLTxBFM8lIiUQkMEUzwMdEJCjIAAAAiUQkIP/VSIvOSIvYQf/WSIXbdQWNQwPrCotHIOsFuAEAAABIi1wkUEiLbCRYSIt0JGBIi3wkaEiDxEBBXsM=" - else - shellcodeBase64 := "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGuemlKHZSNPq56cfWg+PFAB6ICqISDSEZPgAGCwZ7huU2V0V2luZG93c0hvb2tFeFcAAABVbmhvb2tXaW5kb3dzSG9va0V4AENhbGxOZXh0SG9va0V4AAAAAAAAU2VuZE1lc3NhZ2VUaW1lb3V0VwBDb0NyZWF0ZUluc3RhbmNlAAAAAFZX6MkCAACDfCQMAIvwi3wkFHwYhf90FItPCDtOEHUMVuhqAQAAg8QEiUYUjYaIAAAAUP826J4CAACDxAiFwHUFX17CDABX/3QkFP90JBRqAP/QX17CDAAzwMIEAMzMzIPsFFaLdCQchfZ1DLhXAAeAXoPEFMIIAItOBI1UJARSjVQkEMdEJAgAAAAAUosBagFq//90JDBR/1AUhcB4bIN8JAwAdGWDfCQEAHRei04EjVQkHFfHRCQgAAAAAFKLAVH/UCSL+IX/eC2LVCQghdJ0JYsCi0gQjUQkDFCNRghQ/3QkGP90JDBS/9GL+ItEJCBQiwj/UQiLRCQQUIsI/1EIi8dfXoPEFMIIALgBAAAAXoPEFMIIAMyLTCQIVot0JAiF9nRfhcl0W4tUJBCF0nRTiwELQQR1IYF5CMAAAAB1CYF5DAAAAEZ0MscCAAAAALgCQACAXsIMAIE5A+iAqnXpgXkEISDSEXXggXkIk+AAYHXXgXkMsGe4bnXOiTIzwF7CDAC4VwAHgF7CDADMzMyD7BBWi3QkGI2GsAAAAFD/dgToMQEAAIvIg8QIhcl1CI1BAV6DxBDDjUQkBMdEJAQAAAAAUI1GUMdEJBwAAAAAUGoXagCNRkDHRCQYAAAAAFDHRCQgAAAAAMdEJCQBAAAA/9GFwA+IywAAAItMJASFyQ+EvwAAAIsBjVQkDFdSUf9QDIXAeHCLTCQIjVQkHFJRiwH/UByFwHhdi0wkHIXJdFmLAY1UJAxSUf9QGIXAeEaLfCQMhf90UI1OMIl+HLjcAQAAiU4YA8aNVhiJAYvGBRwBAACNTCQUUYlGNIlGOLgkAQAAagMDxlL/dCQciUY8iwdX/1AMi0wkHItUJAyF0nQKiwJS/1AIi0wkHF+FyXQGiwFR/1AIi0wkBIXJdAaLAVH/UAiLRCQQ99heG8CD4ASDxBDDuAQAAABeg8QQw7gAAAAAw8zMg+wIU1VWV4t8JByF/w+EgQAAAItcJCCF23R5i0c8g3w4fAB0b4tEOHiFwHRni0w4JDP2i1Q4IAPPi2w4GAPXiUwkEItMOBwDz4lUJByJTCQUTYorixSyA9c6KnUTis2LwyvThMl0FIpIAUA6DAJ080Y79Xcfi1QkHOvZi0QkEItMJBQPtwRwiwSBA8dfXl1bg8QIw19eXTPAW4PECMPMzFNVVleLfCQUizeNR2BQVuhM////iUQkHI2HnAAAAFBW6Dv///+L2I1HdFBW6C////+LTCQsg8QYi+iFyXRshdt0aIXtdGSLxwWUAwAAiXgBuMQAAAD/dwwDx2oAUGoE/9GJRCQUhcB1DF9eXbgCAAAAW8IEAGoAaMgAAABqAGoAagD/dxD/dwj/0/90JBSL8P/VhfZ1Cl+NRgNeXVvCBACLRxRfXl1bwgQAX15duAEAAABbwgQA" - len := StrLen(shellcodeBase64) - shellcode := Buffer(len * 0.75) - if !DllCall("crypt32\CryptStringToBinary", "str", shellcodeBase64, "uint", len, "uint", 1, "ptr", shellcode, "uint*", shellcode.Size, "ptr", 0, "ptr", 0) - return - return shellcode - } + static getModulesBases(hProcess, modules) { + hModules := Buffer(A_PtrSize * 350) + if !DllCall("K32EnumProcessModulesEx", "ptr", hProcess, "ptr", hModules, "uint", hModules.Size, "uint*", &needed := 0, "uint", 3) + return + moduleBaseMap := Map() + moduleBaseMap.CaseSense := false + for v in modules + moduleBaseMap[v] := 0 + cnt := modules.Length + loop Min(350, needed) { + hModule := NumGet(hModules, A_PtrSize * (A_Index - 1), "ptr") + VarSetStrCapacity(&name, 12) + if DllCall("K32GetModuleBaseNameW", "ptr", hProcess, "ptr", hModule, "str", &name, "uint", 13) { + if moduleBaseMap.Has(name) { + moduleInfo := Buffer(24) + if !DllCall("K32GetModuleInformation", "ptr", hProcess, "ptr", hModule, "ptr", moduleInfo, "uint", moduleInfo.Size) + return + if !base := NumGet(moduleInfo, "ptr") + return + moduleBaseMap[name] := base + cnt-- + } + } + } until cnt == 0 + if cnt == 0 + return moduleBaseMap + } - static link(x64, shellcode, shellcodeBase, user32Base, combaseBase, hwnd, tid, msg, &pThreadProc, &pRect) { - if x64 { - NumPut("uint64", user32Base, shellcode, 0) - NumPut("uint64", combaseBase, shellcode, 8) - NumPut("uint64", hwnd, shellcode, 16) - NumPut("uint", tid, shellcode, 24) - NumPut("uint", msg, shellcode, 28) - pThreadProc := shellcodeBase + 0x4e0 - pRect := shellcodeBase + 56 + static compile(x64) { + if x64 + shellcodeBase64 := "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABrnppSh2UjT6uenH1oPjxQAeiAqiEg0hGT4ABgsGe4blNldFdpbmRvd3NIb29rRXhXAAAAVW5ob29rV2luZG93c0hvb2tFeABDYWxsTmV4dEhvb2tFeAAAAAAAAFNlbmRNZXNzYWdlVGltZW91dFcAQ29DcmVhdGVJbnN0YW5jZQAAAAAAAAAASIlcJAhIiXQkEFdIg+wgSYvYSIvyi/mFyXgjSIXbdB6LBQb///9BOUAQdRJIjQ3d/v//6JgBAACJBfL+//9Iiw3L/v//SI0VdP///+jnAgAASIXAdRBIi1wkMEiLdCQ4SIPEIF/DTIvLTIvGi9czyUiLXCQwSIt0JDhIg8QgX0j/4MzMzMzMzDPAw8zMzMzMQFNWSIPsSIvySIvZSIXJdQy4VwAHgEiDxEheW8NIi0kISI1UJGBIiVQkKEG4/////0iNVCQwSIl8JEAz/0iJVCQgiXwkYIvWSIsBRI1PAf9QKIXAeHJIOXwkMHRrOXwkYHRlSItLCEiNVCR4SIl8JHhIiwH/UEiL+IXAeDJIi0wkeEiFyXQoSIsBSI1UJHBMi0QkMEyNSxBIiVQkIIvW/1AgSItMJHiL+EiLAf9QEEiLTCQwSIsB/1AQi8dIi3wkQEiDxEheW8NIi3wkQLgBAAAASIPESF5bw8zMzMzMzMxIhcl0VEiF0nRPTYXAdEpIiwJIhcB1HUi4wAAAAAAAAEZIOUIIdCxJxwAAAAAAuAJAAIDDSbkD6ICqISDSEUk7wXXkSLiT4ABgsGe4bkg5Qgh11EmJCDPAw7hXAAeAw8xAU0iD7EBIi9lIjZHYAAAASItJCOhPAQAASIXAdQu4AQAAAEiDxEBbwzPJx0QkWAEAAABIjVQkaEiJTCRoSIlUJCBMjUt4M9JIiUwkYEiJTCQwiUwkUEiNS2hEjUIX/9CFwA+I7wAAAEiLTCRoSIXJD4ThAAAASIsBSI1UJFD/UBiFwA+IhQAAAEiLTCRoSI1UJGBIiwH/UDiFwHhxSItMJGBIhcl0bEiLAUiNVCQw/1AwhcB4WEiLTCQwSIXJdGZIjUNISIlLMEiJQyhMjUMoSI0Vyf7//0G5AwAAAEiJEEiNBdH9//9IiUNQSI1UJFhIiUNYSI0Fxf3//0iJQ2BIiwFIiVQkIItUJFD/UBhIi0wkYEiLVCQwSIXSdA5IiwJIi8r/UBBIi0wkYEiFyXQGSIsB/1AQSItMJGhIhcl0BkiLAf9QEItEJFj32BvAg+AESIPEQFvDuAQAAABIg8RAW8PMzMzMzMxIiVwkCEiJbCQQSIl0JBhIiXwkIEyL2kyL0UiFyXRwSIXSdGtIY0E8g7wIjAAAAAB0XYuMCIgAAACFyXRSRYtMCiBJjQQKi3AkTQPKi2gcSQPyi3gYSQPqD7YaRTPA/89BixFJA9I6GnUZD7bLSYvDSSvThMl0Lw+2SAFI/8A6DAJ08EH/wEmDwQREO8d20TPASItcJAhIi2wkEEiLdCQYSIt8JCDDSWPAD7cMRotEjQBJA8Lr28zMSIlcJAhIiWwkEEiJdCQYSIl8JCBBVkiD7EBIixlIjZGIAAAASIv5SIvL6Bn///9IjZfEAAAASIvLSIvw6Af///9IjZecAAAASIvLSIvo6PX+//9Mi/BIhfZ0ZUiF7XRgSIXAdFtEi08YSI0VoPv//0UzwEGNSAT/1kiL8EiFwHUFjUYC6z+LVxwzwEiLTxBFM8lIiUQkMEUzwMdEJCjIAAAAiUQkIP/VSIvOSIvYQf/WSIXbdQWNQwPrCotHIOsFuAEAAABIi1wkUEiLbCRYSIt0JGBIi3wkaEiDxEBBXsM=" + else + shellcodeBase64 := "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGuemlKHZSNPq56cfWg+PFAB6ICqISDSEZPgAGCwZ7huU2V0V2luZG93c0hvb2tFeFcAAABVbmhvb2tXaW5kb3dzSG9va0V4AENhbGxOZXh0SG9va0V4AAAAAAAAU2VuZE1lc3NhZ2VUaW1lb3V0VwBDb0NyZWF0ZUluc3RhbmNlAAAAAFZX6MkCAACDfCQMAIvwi3wkFHwYhf90FItPCDtOEHUMVuhqAQAAg8QEiUYUjYaIAAAAUP826J4CAACDxAiFwHUFX17CDABX/3QkFP90JBRqAP/QX17CDAAzwMIEAMzMzIPsFFaLdCQchfZ1DLhXAAeAXoPEFMIIAItOBI1UJARSjVQkEMdEJAgAAAAAUosBagFq//90JDBR/1AUhcB4bIN8JAwAdGWDfCQEAHRei04EjVQkHFfHRCQgAAAAAFKLAVH/UCSL+IX/eC2LVCQghdJ0JYsCi0gQjUQkDFCNRghQ/3QkGP90JDBS/9GL+ItEJCBQiwj/UQiLRCQQUIsI/1EIi8dfXoPEFMIIALgBAAAAXoPEFMIIAMyLTCQIVot0JAiF9nRfhcl0W4tUJBCF0nRTiwELQQR1IYF5CMAAAAB1CYF5DAAAAEZ0MscCAAAAALgCQACAXsIMAIE5A+iAqnXpgXkEISDSEXXggXkIk+AAYHXXgXkMsGe4bnXOiTIzwF7CDAC4VwAHgF7CDADMzMyD7BBWi3QkGI2GsAAAAFD/dgToMQEAAIvIg8QIhcl1CI1BAV6DxBDDjUQkBMdEJAQAAAAAUI1GUMdEJBwAAAAAUGoXagCNRkDHRCQYAAAAAFDHRCQgAAAAAMdEJCQBAAAA/9GFwA+IywAAAItMJASFyQ+EvwAAAIsBjVQkDFdSUf9QDIXAeHCLTCQIjVQkHFJRiwH/UByFwHhdi0wkHIXJdFmLAY1UJAxSUf9QGIXAeEaLfCQMhf90UI1OMIl+HLjcAQAAiU4YA8aNVhiJAYvGBRwBAACNTCQUUYlGNIlGOLgkAQAAagMDxlL/dCQciUY8iwdX/1AMi0wkHItUJAyF0nQKiwJS/1AIi0wkHF+FyXQGiwFR/1AIi0wkBIXJdAaLAVH/UAiLRCQQ99heG8CD4ASDxBDDuAQAAABeg8QQw7gAAAAAw8zMg+wIU1VWV4t8JByF/w+EgQAAAItcJCCF23R5i0c8g3w4fAB0b4tEOHiFwHRni0w4JDP2i1Q4IAPPi2w4GAPXiUwkEItMOBwDz4lUJByJTCQUTYorixSyA9c6KnUTis2LwyvThMl0FIpIAUA6DAJ080Y79Xcfi1QkHOvZi0QkEItMJBQPtwRwiwSBA8dfXl1bg8QIw19eXTPAW4PECMPMzFNVVleLfCQUizeNR2BQVuhM////iUQkHI2HnAAAAFBW6Dv///+L2I1HdFBW6C////+LTCQsg8QYi+iFyXRshdt0aIXtdGSLxwWUAwAAiXgBuMQAAAD/dwwDx2oAUGoE/9GJRCQUhcB1DF9eXbgCAAAAW8IEAGoAaMgAAABqAGoAagD/dxD/dwj/0/90JBSL8P/VhfZ1Cl+NRgNeXVvCBACLRxRfXl1bwgQAX15duAEAAABbwgQA" + len := StrLen(shellcodeBase64) + shellcode := Buffer(len * 0.75) + if !DllCall("crypt32\CryptStringToBinary", "str", shellcodeBase64, "uint", len, "uint", 1, "ptr", shellcode, "uint*", shellcode.Size, "ptr", 0, "ptr", 0) + return + return shellcode } - else { - NumPut("uint", user32Base, shellcode, 0) - NumPut("uint", combaseBase, shellcode, 4) - NumPut("uint", hwnd, shellcode, 8) - NumPut("uint", tid, shellcode, 12) - NumPut("uint", msg, shellcode, 16) - pThreadProc := shellcodeBase + 0x43c - pRect := shellcodeBase + 32 + + static link(x64, shellcode, shellcodeBase, user32Base, combaseBase, hwnd, tid, msg, &pThreadProc, &pRect) { + if x64 { + NumPut("uint64", user32Base, shellcode, 0) + NumPut("uint64", combaseBase, shellcode, 8) + NumPut("uint64", hwnd, shellcode, 16) + NumPut("uint", tid, shellcode, 24) + NumPut("uint", msg, shellcode, 28) + pThreadProc := shellcodeBase + 0x4e0 + pRect := shellcodeBase + 56 + } + else { + NumPut("uint", user32Base, shellcode, 0) + NumPut("uint", combaseBase, shellcode, 4) + NumPut("uint", hwnd, shellcode, 8) + NumPut("uint", tid, shellcode, 12) + NumPut("uint", msg, shellcode, 16) + pThreadProc := shellcodeBase + 0x43c + pRect := shellcodeBase + 32 + } } - } - static msgWaitForSingleObject(handle) { - while 1 == res := DllCall("MsgWaitForMultipleObjects", "uint", 1, "ptr*", handle, "int", false, "uint", -1, "uint", 7423) { ; QS_ALLINPUT := 7423 - msg := Buffer(A_PtrSize == 8 ? 48 : 28) - while DllCall("PeekMessageW", "ptr", msg, "ptr", 0, "uint", 0, "uint", 0, "uint", 1) { ; PM_REMOVE := 1 - DllCall("TranslateMessage", "ptr", msg) - DllCall("DispatchMessageW", "ptr", msg) + static msgWaitForSingleObject(handle) { + while 1 == res := DllCall("MsgWaitForMultipleObjects", "uint", 1, "ptr*", handle, "int", false, "uint", -1, "uint", 7423) { ; QS_ALLINPUT := 7423 + msg := Buffer(A_PtrSize == 8 ? 48 : 28) + while DllCall("PeekMessageW", "ptr", msg, "ptr", 0, "uint", 0, "uint", 0, "uint", 1) { ; PM_REMOVE := 1 + DllCall("TranslateMessage", "ptr", msg) + DllCall("DispatchMessageW", "ptr", msg) + } } + return res } - return res } + return 0 } getCaretPosFromACC() { - static _ := DllCall("LoadLibrary", "Str", "oleacc", "Ptr") try { + static _ := DllCall("LoadLibrary", "Str", "oleacc", "Ptr") idObject := 0xFFFFFFF8 ; OBJID_CARET if DllCall("oleacc\AccessibleObjectFromWindow", "ptr", WinExist("A"), "uint", idObject &= 0xFFFFFFFF , "ptr", -16 + NumPut("int64", idObject == 0xFFFFFFF0 ? 0x46000000000000C0 : 0x719B3800AA000C81, NumPut("int64", idObject == 0xFFFFFFF0 ? 0x0000000000020400 : 0x11CF3C3D618736E0, IID := Buffer(16))) @@ -592,6 +607,7 @@ end: return 1 } } + return 0 } static guidFromString(str) { diff --git a/src/v2/menu/JAB.ahk b/src/v2/menu/JAB.ahk index 75d3680..d1deacd 100644 --- a/src/v2/menu/JAB.ahk +++ b/src/v2/menu/JAB.ahk @@ -17,8 +17,9 @@ fn_JAB(item, *) { ideGui.SetFont(fz, "微软雅黑") ideGui.AddText(, "已经成功启用了 JAB/JetBrains IDE 支持,你还需要进行以下步骤:") - ideGui.AddEdit("xs -VScroll ReadOnly w" Gui_width, "1. 开启 Java Access Bridge`n2. 点击托盘菜单中的「设置光标获取模式」`n3. 将 JetBrains IDE 或其他 JAB 程序添加到其中的「JAB」列表中`n4. 如果未生效,请重启正在使用的 JetBrains IDE 或其他 JAB 程序`n5. 如果仍未生效,请重启 InputTip 或重启系统`n6. 有多块屏幕时,副屏幕上可能有坐标偏差,需要通过「设置特殊偏移量」调整") + ideGui.AddEdit("xs -VScroll ReadOnly w" Gui_width, "1. 开启 Java Access Bridge`n2. 点击下方的或托盘菜单中的「设置光标获取模式」`n3. 将 JetBrains IDE 或其他 JAB 应用进程添加到其中的「JAB」列表中`n4. 如果未生效,请重启正在使用的 JetBrains IDE 或其他 JAB 应用`n5. 如果仍未生效,请重启 InputTip 或重启系统`n6. 有多块屏幕时,副屏幕上可能有坐标偏差,需要通过「设置特殊偏移量」调整") ideGui.AddLink(, '详细操作步骤,请查看: InputTip 官网 Github Gitee') + ideGui.AddButton("xs w" Gui_width, "「设置光标获取模式」").OnEvent("Click", fn_cursor_mode) y := ideGui.AddButton("xs w" Gui_width, "我知道了") y.OnEvent("Click", yes) y.Focus() diff --git a/src/v2/menu/app-offset.ahk b/src/v2/menu/app-offset.ahk index a3c6a25..884b251 100644 --- a/src/v2/menu/app-offset.ahk +++ b/src/v2/menu/app-offset.ahk @@ -2,11 +2,12 @@ fn_app_offset(*) { fn_common({ gui: "appOffsetGui", config: "app_offset", - tab: ["管理特殊偏移量", "关于"], - tip: "你首先应该点击上方的「关于」查看具体的操作说明", + tab: ["设置特殊偏移量", "关于"], + tip: "你首先应该点击上方的「关于」查看具体的操作说明 ", list: "特殊偏移量列表", color: "cRed", about: '1. 如何使用这个管理面板?`n - 最上方的列表页显示的是当前系统正在运行的应用进程(仅前台窗口)`n - 双击列表中任意应用进程,就可以将其添加到「特殊偏移量列表」中`n - 如果需要更多的进程,请点击右下角的「显示更多进程」以显示后台和隐藏进程`n - 也可以点击右下角的「通过输入进程名称手动添加」直接添加进程名称`n`n - 下方是「特殊偏移量列表」,可以设置指定应用在不同屏幕下的符号显示偏移量`n - 双击列表中任意应用进程,会弹出偏移量设置窗口,或者点击窗口底部按钮移除它`n`n2. 如何设置偏移量?`n - 当双击任意应用进程后,会弹出偏移量设置窗口`n - 通过屏幕标识和坐标信息,判断是哪一块屏幕,然后设置对应的偏移量`n - 偏移量的修改实时生效,你可以立即在对应窗口中看到效果`n - 如何通过屏幕坐标判断屏幕?`n - 假设你有两块屏幕,主屏幕在左侧,另一块屏幕在右侧`n - 那么另一块屏幕的左上角 X 坐标一定大于或等于主屏幕的右下角 X 坐标', + link: '', addConfirm: "", addConfirm2: "", addConfirm3: "", @@ -15,8 +16,14 @@ fn_app_offset(*) { rmConfirm2: "", rmConfirm3: "", }, - "", addClickFn, rmClickFn, addFn + handleFn, addClickFn, rmClickFn, addFn ) + handleFn(*) { + gc.appOffsetGui_LV_rm_title.Text := "特殊偏移量列表 ( " gc.appOffsetGui_LV_rm.GetCount() " 个 )" + writeIni("app_offset", "") + global app_offset := {} + restartJetBrains() + } addClickFn(LV, RowNumber, tipList) { handleClick(LV, RowNumber, tipList, "add") @@ -139,8 +146,11 @@ fn_app_offset(*) { for v in screenList { app_offset.%app%.%v.num% := { x: 0, y: 0 } } - fn_write_offset() - updateWhiteList(app) + SetTimer(timer, -1) + timer(*) { + fn_write_offset() + updateWhiteList(app) + } } offsetGui := Gui("AlwaysOnTop", "InputTip - 设置 " app " 的特殊偏移量") offsetGui.SetFont(fz, "微软雅黑") @@ -219,6 +229,7 @@ fn_app_offset(*) { offsetGui.Show() fn_write_offset() { + gc.appOffsetGui_LV_rm_title.Text := "特殊偏移量列表 ( " gc.appOffsetGui_LV_rm.GetCount() " 个 )" _app_offset := "" for v in app_offset.OwnProps() { _info := v "|" diff --git a/src/v2/menu/bw-list.ahk b/src/v2/menu/bw-list.ahk index 6eeb1a9..378ce04 100644 --- a/src/v2/menu/bw-list.ahk +++ b/src/v2/menu/bw-list.ahk @@ -14,12 +14,43 @@ fn_bw_list(*) { g.AddText(, "-------------------------------------------------------------------------------------") g.AddText(, "选择显示符号的名单机制: ") - g.AddDropDownList("yp AltSubmit vuseWhiteList Choose" useWhiteList + 1, ["使用「黑」名单", "使用「白」名单"]).OnEvent("Change", fn_change_list) + gc._bw_list := g.AddDropDownList("yp AltSubmit vuseWhiteList Choose" useWhiteList + 1, ["使用「黑」名单", "使用「白」名单"]) + gc._bw_list.OnEvent("Change", fn_change_list) fn_change_list(item, *) { - value := item.Value - 1 - writeIni("useWhiteList", value) - global useWhiteList := value - restartJetBrains() + if (useWhiteList = item.Value) { + createGui(fn).Show() + fn(x, y, w, h) { + if (gc.w.subGui) { + gc.w.subGui.Destroy() + gc.w.subGui := "" + } + gc._bw_list.Value := useWhiteList + 1 + g := Gui("AlwaysOnTop") + g.SetFont(fz, "微软雅黑") + bw := w - g.MarginX * 2 + g.AddText("cRed", "确定要使用「黑」名单吗?") + g.AddText("cRed", "这是不建议的,使用它,你需要承担未知的可能存在的窗口兼容性代价") + g.AddButton("w" bw, "【是】我确定要使用「黑」名单").OnEvent("Click", yes) + g.AddButton("w" bw, "【否】不,我只是不小心点到了").OnEvent("Click", no) + g.OnEvent("Close", no) + yes(*) { + g.Destroy() + gc._bw_list.Value := 1 + writeIni("useWhiteList", 0) + global useWhiteList := 0 + } + no(*) { + g.Destroy() + } + gc.w.subGui := g + return g + } + } else { + value := item.Value - 1 + writeIni("useWhiteList", value) + global useWhiteList := value + restartJetBrains() + } } g.AddEdit("xs Disabled", "如果使用「黑」名单,你需要承担未知的可能存在的窗口兼容性代价") _c := g.AddButton("xs w" bw, "设置「白」名单") @@ -35,23 +66,25 @@ fn_bw_list(*) { fn_common({ gui: "blackListGui", config: "app_hide_state", - tab: ["管理黑名单", "关于"], - tip: "你首先应该点击上方的「关于」查看具体的操作说明", + tab: ["设置黑名单", "关于"], + tip: "你首先应该点击上方的「关于」查看具体的操作说明 ", list: "符号显示黑名单", color: "cRed", - about: '1. 如何使用这个管理面板?`n - 最上方的列表页显示的是当前系统正在运行的应用进程(仅前台窗口)`n - 双击列表中任意应用进程,就可以将其添加到「符号显示黑名单」中`n - 如果需要更多的进程,请点击右下角的「显示更多进程」以显示后台和隐藏进程`n - 也可以点击右下角的「通过输入进程名称手动添加」直接添加进程名称`n - 下方是「符号显示黑名单」应用进程列表,如果使用黑名单机制,它将生效`n - 双击列表中任意应用进程,就可以将它移除`n`n - 黑名单机制: 只有不在黑名单中的应用进程窗口才会显示符号`n - 使用黑名单,可能会有一些特殊窗口的兼容性问题`n - 建议使用 白名单机制,最好少用黑名单机制`n`n2. 如何快速添加应用进程?`n - 每次双击应用进程后,会弹出操作窗口,需要选择添加/移除或取消`n - 如果你确定当前操作不需要取消,可以在操作窗口弹出后,按下空格键快速确认', + about: '1. 如何使用这个管理面板?`n - 最上方的列表页显示的是当前系统正在运行的应用进程(仅前台窗口)`n - 双击列表中任意应用进程,就可以将其添加到「符号显示黑名单」中`n - 如果需要更多的进程,请点击右下角的「显示更多进程」以显示后台和隐藏进程`n - 也可以点击右下角的「通过输入进程名称手动添加」直接添加进程名称`n - 下方是「符号显示黑名单」应用进程列表,如果使用黑名单机制,它将生效`n - 双击列表中任意应用进程,就可以将它移除`n`n - 黑名单机制: 只有不在黑名单中的应用进程窗口才会显示符号`n - 使用黑名单,可能会有一些特殊窗口的兼容性问题`n - 建议使用白名单机制,最好少用黑名单机制`n`n2. 如何快速添加应用进程?`n - 每次双击应用进程后,会弹出操作窗口,需要选择添加/移除或取消`n - 如果你确定当前操作不需要取消,可以在操作窗口弹出后,按下空格键快速确认', + link: '相关链接: 白名单机制', addConfirm: "是否要将", addConfirm2: "添加到「符号显示黑名单」中?", - addConfirm3: "添加后,黑名单机制下,在此应用窗口中时,不会显示符号(图片/方块/文本符号)", + addConfirm3: "添加后,黑名单机制下,在此应用窗口中时,不会显示符号", addConfirm4: "", rmConfirm: "是否要将", rmConfirm2: "从「符号显示黑名单」中移除?", - rmConfirm3: "移除后,黑名单机制下,在此应用窗口中时,会显示符号(图片/方块/文本符号)", + rmConfirm3: "移除后,黑名单机制下,在此应用窗口中时,会显示符号", }, fn ) fn(value) { global app_hide_state := ":" value ":" + gc.blackListGui_LV_rm_title.Text := "符号显示黑名单 ( " gc.blackListGui_LV_rm.GetCount() " 个 )" restartJetBrains() } } diff --git a/src/v2/menu/check-update.ahk b/src/v2/menu/check-update.ahk index 204e4f1..1ae5e1c 100644 --- a/src/v2/menu/check-update.ahk +++ b/src/v2/menu/check-update.ahk @@ -1,4 +1,4 @@ -fn_check_update(item, *) { +fn_check_update(*) { createGui(fn).Show() fn(x, y, w, h) { if (gc.w.checkUpdateGui) { @@ -8,11 +8,12 @@ fn_check_update(item, *) { 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") - g.AddText("xs", "每隔多少分钟检测一次更新: ") + g.AddEdit("ReadOnly cRed -VScroll w" w - g.MarginX * 2, "- 单位: 分钟,默认 1440 分钟(1 天)`n- 避免程序错误,可以设置的最大范围是 0-50000 分钟`n- 如果为 0,则表示不检测版本更新`n- 如果不为 0,在 InputTip 启动后,会立即检测一次`n- 如果大于 50000,则会直接使用 50000`n") + g.AddText(, "每隔多少分钟检测一次更新: ") _c := g.AddEdit("yp Number Limit5 vcheckUpdateDelay") _c.Value := readIni("checkUpdateDelay", 1440) _c.OnEvent("Change", fn_change_delay) + _c.Focus() g.AddText() fn_change_delay(item, *) { value := item.Value diff --git a/src/v2/menu/config.ahk b/src/v2/menu/config.ahk index 6cd7a46..c82baf2 100644 --- a/src/v2/menu/config.ahk +++ b/src/v2/menu/config.ahk @@ -23,7 +23,7 @@ fn_config(*) { tab.UseTab(1) configGui.AddText("Section cRed", "在更改配置前,你应该首先阅读一下相关的说明文档") - configGui.AddLink("xs", '文档官网') + configGui.AddLink("xs", '官网') configGui.AddLink("yp", 'Github') configGui.AddLink("yp", 'Gitee') configGui.AddLink("yp", '一些常见的使用问题') @@ -105,7 +105,7 @@ fn_config(*) { updateDelay() restartJetBrains() } - configGui.AddEdit("xs Disabled -VScroll w" Gui_width, "单位: 毫秒,默认为 0 毫秒,表示不隐藏符号。`n当不为 0 时,此值不能小于 150,若小于 150,则使用 150。建议 500 以上。`n符号隐藏后,下次键盘操作或点击鼠标左键会再次显示符号") + configGui.AddEdit("xs ReadOnly cGray -VScroll w" Gui_width, "单位: 毫秒,默认为 0 毫秒,表示不隐藏符号。`n当不为 0 时,此值不能小于 150,若小于 150,则使用 150。建议 500 以上。`n符号隐藏后,下次键盘操作或点击鼠标左键会再次显示符号") configGui.AddText("xs", "4. 每多少") configGui.AddText("yp cRed", "毫秒") configGui.AddText("yp", "后更新符号的显示位置和状态:") @@ -124,7 +124,7 @@ fn_config(*) { restartJetBrains() } ; configGui.AddUpDown("Range1-500", delay) - configGui.AddEdit("xs Disabled -VScroll w" Gui_width, "单位:毫秒,默认为 50 毫秒。一般使用 1-100 之间的值。`n此值的范围是 1-500,如果超出范围则无效,会取最近的可用值。`n值越小,响应越快,性能消耗越大,根据电脑性能适当调整") + configGui.AddEdit("xs ReadOnly cGray -VScroll w" Gui_width, "单位:毫秒,默认为 50 毫秒。一般使用 1-100 之间的值。`n此值的范围是 1-500,如果超出范围则无效,会取最近的可用值。`n值越小,响应越快,性能消耗越大,根据电脑性能适当调整") tab.UseTab(2) configGui.AddText(, "你可以点击以下任意网址获取设置鼠标样式文件夹的相关说明:") @@ -539,7 +539,69 @@ fn_config(*) { writeIni("gui_font_size", item.Value) global fz := "s" item.Value } - configGui.AddEdit("xs Disabled -VScroll w" Gui_width, "取值范围: 5-30,超出范围的值无效,建议 12-20。`n如果觉得配置菜单的字体太大或太小,可以适当调整这个值,重新打开配置菜单即可。") + configGui.AddEdit("xs ReadOnly cGray -VScroll w" Gui_width, "取值范围: 5-30,超出范围的值无效,建议 12-20。`n如果觉得配置菜单的字体太大或太小,可以适当调整这个值,重新打开配置菜单即可。") + + configGui.AddText("Section", "2. 点击下方按钮,实时显示当前激活的窗口进程信息") + gc._window_info := configGui.AddButton("w" Gui_width, "获取窗口进程信息") + gc._window_info.OnEvent("Click", fn_window_info) + configGui.AddText("xs", " - 窗口进程") + configGui.AddText("yp cRed", "名称") + configGui.AddText("yp", ": ") + gc.app_name := configGui.AddEdit("yp ReadOnly -VScroll w" Gui_width / 5 * 4) + configGui.AddText("xs", " - 窗口进程") + configGui.AddText("yp cRed", "标题") + configGui.AddText("yp", ": ") + gc.app_title := configGui.AddEdit("yp ReadOnly -VScroll w" Gui_width / 5 * 4) + configGui.AddText("xs", " - 窗口进程") + configGui.AddText("yp cRed", "路径") + configGui.AddText("yp", ": ") + gc.app_path := configGui.AddEdit("yp ReadOnly -VScroll w" Gui_width / 5 * 4) + fn_window_info(*) { + if (gc.timer) { + gc.timer := 0 + gc._window_info.Text := "获取窗口进程信息" + return + } + + gc.timer := 1 + gc._window_info.Text := "停止获取" + + SetTimer(statusTimer, 25) + statusTimer() { + static first := "", last := "" + + if (!gc.timer) { + SetTimer(, 0) + first := "" + last := "" + return + } + + try { + if (!first) { + name := WinGetProcessName("A") + title := WinGetTitle("A") + path := WinGetProcessPath("A") + gc.app_name.Value := name + gc.app_title.Value := title + gc.app_path.Value := path + first := name title path + } + + name := WinGetProcessName("A") + title := WinGetTitle("A") + path := WinGetProcessPath("A") + info := name title path + if (info = last || info = first) { + return + } + gc.app_name.Value := name + gc.app_title.Value := title + gc.app_path.Value := path + last := info + } + } + } tab.UseTab(7) configGui.AddText(, "1. 对于颜色相关的配置,建议使用 16 进制的颜色值`n2. 不过由于没有调色板,可能并不好设置`n3. 建议使用以下配色网站(也可以自己去找),找到喜欢的颜色,复制 16 进制值`n4. 显示的颜色以最终渲染的颜色效果为准") configGui.AddLink(, 'https://colorhunt.co') @@ -550,6 +612,7 @@ fn_config(*) { configGui.OnEvent("Close", fn_close) fn_close(*) { configGui.Destroy() + gc.timer := 0 } gc.w.configGui := configGui configGui.Show() diff --git a/src/v2/menu/cursor-mode.ahk b/src/v2/menu/cursor-mode.ahk index 846170c..dd9fca6 100644 --- a/src/v2/menu/cursor-mode.ahk +++ b/src/v2/menu/cursor-mode.ahk @@ -18,7 +18,7 @@ fn_cursor_mode(*) { tab := g.AddTab3("-Wrap", ["设置光标获取模式", "关于"]) tab.UseTab(1) - g.AddLink("Section cRed", "你首先应该点击上方的「关于」查看具体的操作说明") + g.AddLink("Section cRed", "你首先应该点击上方的「关于」查看具体的操作说明 ") gc.LV_add := g.AddListView("-LV0x10 -Multi r7 NoSortHdr Sort Grid w" w, ["应用进程列表", "窗口标题", "应用进程文件所在位置"]) gc.LV_add.OnEvent("DoubleClick", fn_add) fn_add(LV, RowNumber) { @@ -54,22 +54,37 @@ fn_cursor_mode(*) { gc.LV_add.Opt("+Redraw") DetectHiddenWindows 1 - addItem(state) { - gc.%"LV_" state%.Opt("-Redraw") - valueArr := StrSplit(readIni("cursor_mode_" state, ""), ":") + addItem(mode) { + gc.%"LV_" mode%.Opt("-Redraw") + valueArr := StrSplit(readIni("cursor_mode_" mode, ""), ":") temp := ":" for v in valueArr { if (Trim(v) && !InStr(temp, ":" v ":")) { - gc.%"LV_" state%.Add(, v) + gc.%"LV_" mode%.Add(, v) temp .= v ":" } } - gc.%"LV_" state%.Opt("+Redraw") + gc.%"LV_" mode%.Opt("+Redraw") + gc.%mode "_title"%.Value .= " ( " gc.%"LV_" mode%.GetCount() " 个 )" } for i, v in modeNameList { opt := i = 1 || i = 5 ? "xs" : "yp" - gc.%"LV_" v% := g.AddListView(opt " cRed -LV0x10 -Multi r5 NoSortHdr Sort Grid w" bw / 4, [v]) + if (i = 1) { + for value in [1, 2, 3, 4] { + o := value = 1 ? "xs" : "yp" + item := modeNameList[value] + gc.%item "_title"% := g.AddText(o " w" bw / 4, item) + } + } + if (i = 5) { + for value in [5, 6, 7, 8] { + o := value = 5 ? "xs" : "yp" + item := modeNameList[value] + gc.%item "_title"% := g.AddText(o " w" bw / 4, item) + } + } + gc.%"LV_" v% := g.AddListView(opt " cRed -Hdr -LV0x10 -Multi r5 NoSortHdr Sort Grid w" bw / 4, [v]) addItem(v) gc.%"LV_" v%.ModifyCol(1, "AutoHdr") gc.%"LV_" v%.OnEvent("DoubleClick", fn_mode) @@ -94,6 +109,9 @@ fn_cursor_mode(*) { g_1.Destroy() gc.%"LV_" from%.Delete(RowNumber) if (from != "add") { + v := gc.%from "_title"%.Value + gc.%from "_title"%.Value := SubStr(v, 1, InStr(v, " ")) "( " gc.%"LV_" from%.GetCount() " 个 )" + config := "cursor_mode_" from value := readIni(config, "") res := "" @@ -109,6 +127,8 @@ fn_cursor_mode(*) { if (!InStr(":" value ":", ":" RowText ":")) { gc.%"LV_" to%.Add(, RowText) + v := gc.%to "_title"%.Value + gc.%to "_title"%.Value := SubStr(v, 1, InStr(v, " ")) "( " gc.%"LV_" to%.GetCount() " 个 )" if (value) { writeIni(config, value ":" RowText) } else { @@ -128,13 +148,11 @@ fn_cursor_mode(*) { if (useWhiteList) { g_1.AddLink("xs cRed", "如果此应用不在白名单中,则会同步添加到白名单中") } - - mode_list := modeNameList.Clone() - if (from != "add") { - mode_list.RemoveAt(modeListMap.%from%) - } - for i, v in mode_list { + for i, v in modeNameList { opt := i = 1 || i = 5 ? "xs" : "yp" + if (v = from) { + opt .= " Disabled" + } _g := g_1.AddButton(opt " w" bw / 4, v) _g._mode := v _g.OnEvent("Click", fn_mode) @@ -147,6 +165,8 @@ fn_cursor_mode(*) { fn_rm(*) { g_1.Destroy() LV.Delete(RowNumber) + v := gc.%from "_title"%.Value + gc.%from "_title"%.Value := SubStr(v, 1, InStr(v, " ")) "( " gc.%"LV_" from%.GetCount() " 个 )" try { gc.LV_add.Add(, RowText, WinGetTitle("ahk_exe " RowText)) } @@ -255,6 +275,8 @@ fn_cursor_mode(*) { } gc.%"LV_" to%.Add(, exe_name) + v := gc.%to "_title"%.Value + gc.%to "_title"%.Value := SubStr(v, 1, InStr(v, " ")) "( " gc.%"LV_" to%.GetCount() " 个 )" if (value) { writeIni(config, value ":" exe_name) } else { @@ -286,8 +308,8 @@ fn_cursor_mode(*) { gc.LV_add.ModifyCol(2, "AutoHdr") gc.LV_add.ModifyCol(3, "AutoHdr") tab.UseTab(2) - g.AddLink(, '1. 如何使用这个管理面板?`n - 最上方的列表页显示的是当前系统正在运行的应用进程(仅前台窗口)`n - 双击列表中任意应用进程,就可以将其添加到下方任意列表中`n - 如果需要更多的进程,请点击下方的「显示更多进程」以显示后台和隐藏进程`n - 也可以点击下方的「通过输入进程名称手动添加」直接添加进程名称`n - 下方分别是 InputTip 的多种光标获取模式`n - 不用在意这些模式是啥,只要记住,哪个能用,就用哪个即可`n - 这几个模式列表中的应用进程会使用对应的模式尝试去获取光标位置`n - 双击列表中任意应用进程,就可以将它移除或者添加到其他列表中`n - 如果选择添加且此应用不在白名单中,则会同步添加到白名单中`n`n2. 什么时候需要去添加?`n - 当你发现一个应用窗口,无法获取到光标位置,或者有兼容性问题`n - 就可以尝试将其添加到下方的各个列表中,看哪个模式是可用的且无兼容性问题的`n - 如果所有模式都不可用,则表示在此窗口中获取不到光标位置,暂时无法解决`n - 如果已知都不可用,记得移除它`n`n3. JetBrains 系列 IDE`n - JetBrains 系列 IDE 需要添加到「JAB」列表中`n - 如果未生效,请检查是否完成「启用 JetBrains IDE 支持」中的所有操作步骤`n - 你应该访问这些相关链接: InputTip 官网 Github Gitee') - + g.AddEdit("ReadOnly -VScroll w" w, '1. 如何使用这个管理面板?`n - 最上方的列表页显示的是当前系统正在运行的应用进程(仅前台窗口)`n - 双击列表中任意应用进程,就可以将其添加到下方任意列表中`n - 如果需要更多的进程,请点击下方的「显示更多进程」以显示后台和隐藏进程`n - 也可以点击下方的「通过输入进程名称手动添加」直接添加进程名称`n - 下方分别是 InputTip 的多种光标获取模式`n - 不用在意这些模式是啥,只要记住,哪个能用,就用哪个即可`n - 如果很想了解相关内容,请查看下方相关链接`n - 这几个模式列表中的应用进程会使用对应的模式尝试去获取光标位置`n - 双击列表中任意应用进程,就可以将它移除或者添加到其他列表中`n - 白名单机制下,选择添加且此应用不在白名单中,则会同步添加到白名单中`n`n2. 什么时候需要去添加?`n - 当你发现一个应用窗口,无法获取到光标位置,或者有兼容性问题时`n - 就可以尝试将其添加到下方的各个列表中,看哪个模式是可用的且无兼容性问题的`n - 如果所有模式都不可用,则表示在此窗口中获取不到光标位置,暂时无法解决`n - 如果已知都不可用,记得移除这个应用进程`n`n3. JetBrains 系列 IDE`n - JetBrains 系列 IDE 需要添加到「JAB」列表中`n - 如果未生效,请检查是否完成「启用 JAB/JetBrains IDE 支持」中的所有操作步骤') + g.AddLink(, '相关链接: 关于光标获取模式') g.OnEvent("Close", fn_close) fn_close(*) { g.Destroy() diff --git a/src/v2/menu/input-mode.ahk b/src/v2/menu/input-mode.ahk index c90a143..9b593e1 100644 --- a/src/v2/menu/input-mode.ahk +++ b/src/v2/menu/input-mode.ahk @@ -1,4 +1,4 @@ -fn_input_mode(item, *) { +fn_input_mode(*) { createGui(fn).Show() fn(x, y, w, h) { global statusModeEN, conversionModeEN, mode, checkTimeout, gc @@ -109,7 +109,7 @@ fn_input_mode(item, *) { } } timeout.Value := checkTimeout - g.AddEdit("xs Disabled -VScroll w" w, "单位:毫秒,默认 500 毫秒。`n每次切换输入法状态,InputTip 会从系统获取新的输入法状态。`n如果超过了这个时间,则认为获取失败,直接显示英文状态。`n它可能是有时识别不到输入法状态的原因,可以尝试调节它。") + g.AddEdit("xs ReadOnly cGray -VScroll w" w, "单位:毫秒,默认 500 毫秒。`n每次切换输入法状态,InputTip 会从系统获取新的输入法状态。`n如果超过了这个时间,则认为获取失败,直接显示英文状态。`n它可能是有时识别不到输入法状态的原因,可以尝试调节它。") g.AddText("xs", "3. Shift 按键是否可以切换输入法状态") gc.useShift := g.AddDropDownList("yp vuseShift Choose" useShift + 1, ["【否】(慎重选择)", "【是】"]) gc.useShift.OnEvent("Change", fn_change_useShift) @@ -125,8 +125,8 @@ fn_input_mode(item, *) { g := Gui("AlwaysOnTop") g.SetFont(fz, "微软雅黑") bw := w - g.MarginX * 2 - g.AddText("cRed", "确定要使用 【否】 吗?") - g.AddText("cRed", "除非你的输入法自定义了切换状态的按键,且禁用了 Shift 切换,才需要选择 【否】。`n如果选择 【否】,在美式键盘或部分特殊输入法中,可能会导致状态提示间歇性错误。") + g.AddText("cRed", "确定要使用【否】吗?") + g.AddText("cRed", "除非你的输入法自定义了切换状态的按键,且禁用了 Shift 切换,才需要选择【否】。`n如果选择【否】,在美式键盘或部分特殊输入法中,可能会导致状态提示间歇性错误。") g.AddText("cRed", "更建议不要使用【否】,而是启用 Shift 切换状态,这也是几乎所有输入法的默认设置。") g.AddButton("w" bw, "我确定要使用【否】").OnEvent("Click", yes) g.AddButton("w" bw, "不,我只是误点了").OnEvent("Click", no) @@ -150,7 +150,7 @@ fn_input_mode(item, *) { restartJetBrains() } } - g.AddEdit("xs Disabled -VScroll w" w, "除非你的输入法自定义了切换状态的按键,且禁用了 Shift 切换,才需要选择 【否】。`n如果选择 【否】,在美式键盘或部分特殊输入法中,可能会导致状态提示间歇性错误。") + g.AddEdit("xs ReadOnly cGray -VScroll w" w, "除非你的输入法自定义了切换状态的按键,且禁用了 Shift 切换,才需要选择【否】。`n如果选择【否】,在美式键盘或部分特殊输入法中,可能会导致状态提示间歇性错误。") tab.UseTab(2) g.AddText("Section", "1.") g.AddText("yp cRed", "英文状态") @@ -218,24 +218,28 @@ fn_input_mode(item, *) { } restartJetBrains() } - g.AddButton("xs w" bw, "显示/关闭实时的状态码和切换码").OnEvent("Click", showStatus) + gc.status_btn := g.AddButton("xs w" bw, "显示实时的状态码和切换码") + gc.status_btn.OnEvent("Click", showStatus) showStatus(*) { - static isOpen := 0 + if (gc.timer) { + gc.timer := 0 + gc.status_btn.Text := "显示实时的状态码和切换码" + return + } - if (isOpen) { - isOpen := 0 - } else { - isOpen := 1 - SetTimer(statusTimer, 25) - statusTimer() { - if (isOpen) { - info := IME.CheckInputMode() - ToolTip("状态码: " IME.CheckInputMode().statusMode "`n切换码: " IME.CheckInputMode().conversionMode) - } else { - ToolTip() - SetTimer(, 0) - } + gc.timer := 1 + gc.status_btn.Text := "关闭实时的状态码和切换码" + + SetTimer(statusTimer, 25) + statusTimer() { + if (!gc.timer) { + ToolTip() + SetTimer(, 0) + return } + + info := IME.CheckInputMode() + ToolTip("状态码: " info.statusMode "`n切换码: " info.conversionMode) } } 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 去判断当前是中文还是英文,就不填切换码,保持切换码为空。") @@ -243,6 +247,7 @@ fn_input_mode(item, *) { g.OnEvent("Close", fn_close) fn_close(*) { g.Destroy() + gc.timer := 0 } gc.w.inputModeGui := g return g diff --git a/src/v2/menu/pause-key.ahk b/src/v2/menu/pause-key.ahk index c020ee5..3d0a7b8 100644 --- a/src/v2/menu/pause-key.ahk +++ b/src/v2/menu/pause-key.ahk @@ -3,7 +3,7 @@ fn_pause_key(*) { gc.w.pauseHotkeyGui.Destroy() gc.w.pauseHotkeyGui := "" } - line := "----------------------------------------------------------------------------" + line := "---------------------------------------------------------------------------------" hotkeyGui := Gui("AlwaysOnTop") hotkeyGui.SetFont(fz, "微软雅黑") hotkeyGui.AddText(, line) @@ -18,9 +18,9 @@ fn_pause_key(*) { tab := hotkeyGui.AddTab3("-Wrap", ["设置组合快捷键", "手动输入快捷键"]) tab.UseTab(1) - hotkeyGui.AddText("Section", "1. 当右侧的 Win 复选框勾选后,表示快捷键中加入 Win 修饰键") - hotkeyGui.AddText("xs", "2. 使用 Backspace(退格键) 或 Delete(删除键) 可以移除不需要的快捷键") - hotkeyGui.AddText("xs", line) + hotkeyGui.AddText("Section", "1. 直接按下快捷键即可设置,除非快捷键被占用,则使用「手动输入快捷键」") + hotkeyGui.AddText("xs", "2. 使用 Backspace(退格键) 或 Delete(删除键) 可以清除快捷键") + hotkeyGui.AddText("xs", "3. 通过勾选右侧的 Win 键来表示快捷键中需要加入 Win 修饰键`n" line) hotkeyGui.AddText("xs", "设置") hotkeyGui.AddText("yp cRed", "暂停/运行") @@ -62,9 +62,9 @@ fn_pause_key(*) { } tab.UseTab(2) hotkeyGui.AddLink("Section", "1.") - hotkeyGui.AddLink("yp cRed", "优先使用「设置组合快捷键」设置,除非因为快捷键占用无法设置") - hotkeyGui.AddLink("xs", '2. 如何手动输入快捷键') - hotkeyGui.AddText("xs", line) + hotkeyGui.AddLink("yp cRed", "优先使用「设置组合快捷键」进行设置,除非因为快捷键占用无法设置") + hotkeyGui.AddLink("xs", '2. 你需要首先查看 如何手动输入快捷键') + hotkeyGui.AddLink("xs", '3. 建议先使用「设置组合快捷键」,然后回到此处适当修改`n' line) hotkeyGui.AddText("xs", "设置") hotkeyGui.AddText("yp cRed", "暂停/运行") hotkeyGui.AddText("yp", "的快捷键: ") @@ -87,9 +87,9 @@ fn_pause_key(*) { hotkeyGui.AddButton("xs w" bw, "确定").OnEvent("Click", yes2) yes2(*) { if (hotkeyGui.Submit().win) { - key := "#" hotkeyGui.Submit().hotkey_Pause + key := "#" hotkeyGui.Submit().hotkey_Pause2 } else { - key := hotkeyGui.Submit().hotkey_Pause + key := hotkeyGui.Submit().hotkey_Pause2 } writeIni("hotkey_Pause", key) fn_restart() diff --git a/src/v2/menu/startup.ahk b/src/v2/menu/startup.ahk index 4da5944..a8407f6 100644 --- a/src/v2/menu/startup.ahk +++ b/src/v2/menu/startup.ahk @@ -49,8 +49,8 @@ fn_startup(item, *) { } g := Gui("AlwaysOnTop +OwnDialogs", "设置开机自启动") g.SetFont(fz, "微软雅黑") - g.AddLink(, '详情: https://inputtip.pages.dev/FAQ/#关于开机自启动') - g.AddLink(, "当前有多种方式设置开机自启动,请选择有效的方式 :`n`n1. 通过「任务计划程序」`n2. 通过软件快捷方式`n3. 通过添加「注册表」`n`n「任务计划程序」可以避免管理员授权窗口(UAC)的干扰(部分用户无效)") + g.AddLink(, '详情请查看: 关于开机自启动 `n') + g.AddEdit("xs ReadOnly -VScroll w" w, "1. 当前有多种方式设置开机自启动,请选择有效的方式 :`n - 通过「任务计划程序」`n - 通过应用快捷方式`n - 通过添加「注册表」`n`n2. 如何避免管理员授权窗口(UAC)的干扰?`n - 使用「任务计划程序」`n - 将系统设置中的「更改用户账户控制设置」修改为【从不通知】`n") btn := g.AddButton("w" w isDisabled, "使用「任务计划程序」" pad) btn.Focus() @@ -60,7 +60,7 @@ fn_startup(item, *) { FileCreateShortcut("C:\WINDOWS\system32\schtasks.exe", A_Startup "\" fileLnk, , "/run /tn `"abgox.InputTip.noUAC`"", , favicon, , , 7) fn_handle() } - btn := g.AddButton("w" w, "使用软件快捷方式") + btn := g.AddButton("w" w, "使用应用快捷方式") if (!A_IsAdmin) { btn.Focus() } diff --git a/src/v2/menu/switch-key.ahk b/src/v2/menu/switch-key.ahk index 3d4f299..05d898f 100644 --- a/src/v2/menu/switch-key.ahk +++ b/src/v2/menu/switch-key.ahk @@ -19,7 +19,8 @@ fn_switch_key(*) { tab := hotkeyGui.AddTab3("-Wrap", ["设置单键", "设置组合快捷键", "手动输入快捷键"]) tab.UseTab(1) hotkeyGui.AddText("Section", "1. LShift 指的是左侧的 Shift 键,RShift 指的是右侧的 Shift 键,以此类推") - hotkeyGui.AddText("xs", "2. 如果要移除快捷键,请选择「无」`n" line) + hotkeyGui.AddText("xs", "2. 单键不会覆盖原本的按键功能,因为在设置的单键抬起时才会触发强制切换") + hotkeyGui.AddText("xs", "3. 如果要移除快捷键,请选择「无」`n" line) singleHotKeyList := [{ tip: "中文状态", @@ -85,8 +86,9 @@ fn_switch_key(*) { fn_restart() } tab.UseTab(2) - hotkeyGui.AddText("Section", "1. 当右侧的 Win 复选框勾选后,表示快捷键中加入 Win 修饰键") - hotkeyGui.AddText("xs", "2. 使用 Backspace(退格键) 或 Delete(删除键) 可以移除不需要的快捷键`n" line) + hotkeyGui.AddText("Section", "1. 直接按下快捷键即可设置,除非快捷键被占用,则使用「手动输入快捷键」") + hotkeyGui.AddText("xs", "2. 使用 Backspace(退格键) 或 Delete(删除键) 可以清除快捷键") + hotkeyGui.AddText("xs", "3. 通过勾选右侧的 Win 键来表示快捷键中需要加入 Win 修饰键`n" line) configList := [{ config: "hotkey_CN", @@ -153,7 +155,8 @@ fn_switch_key(*) { tab.UseTab(3) hotkeyGui.AddLink("Section", "1.") hotkeyGui.AddLink("yp cRed", "优先使用「设置单键」或「设置组合快捷键」设置,除非因为快捷键占用无法设置") - hotkeyGui.AddLink("xs", '2. 如何手动输入快捷键`n' line) + hotkeyGui.AddLink("xs", '2. 你需要首先查看 如何手动输入快捷键') + hotkeyGui.AddLink("xs", '3. 建议先使用「设置单键」或「设置组合快捷键」,然后回到此处适当修改`n' line) for v in configList { hotkeyGui.AddText("xs", "强制切换到") hotkeyGui.AddText("yp cRed", v.tip) diff --git a/src/v2/menu/switch-window.ahk b/src/v2/menu/switch-window.ahk index 6cbf932..8d9532f 100644 --- a/src/v2/menu/switch-window.ahk +++ b/src/v2/menu/switch-window.ahk @@ -16,9 +16,9 @@ fn_switch_window(*) { g.SetFont(fz, "微软雅黑") bw := w - g.MarginX * 2 - tab := g.AddTab3("-Wrap", ["管理状态自动切换", "关于"]) + tab := g.AddTab3("-Wrap", ["设置状态自动切换", "关于"]) tab.UseTab(1) - g.AddLink("Section cRed", "你首先应该点击上方的「关于」查看具体的操作说明") + g.AddLink("Section cRed", "你首先应该点击上方的「关于」查看具体的操作说明 ") gc.LV_add := g.AddListView("-LV0x10 -Multi r7 NoSortHdr Sort Grid w" bw, ["正在运行的应用进程列表", "窗口标题", "应用进程文件所在位置"]) gc.LV_add.OnEvent("DoubleClick", fn_add) fn_add(LV, RowNumber) { @@ -55,17 +55,22 @@ fn_switch_window(*) { } } gc.%"LV_" state%.Opt("+Redraw") + gc.%state "_title"%.Value .= " ( " gc.%"LV_" state%.GetCount() " 个 )" } + gc.CN_title := g.AddText("xs w" bw / 3, "中文状态") + gc.EN_title := g.AddText("yp w" bw / 3, "英文状态") + gc.Caps_title := g.AddText("yp w" bw / 3, "大写锁定") + if (CN_color) { c := "c" StrReplace(CN_color, "#") } else { c := "" } try { - gc.LV_CN := g.AddListView("xs -LV0x10 -Multi r5 NoSortHdr Sort Grid w" bw / 3 " " c, ["自动切换中文"]) + gc.LV_CN := g.AddListView("xs -Hdr -LV0x10 -Multi r5 NoSortHdr Sort Grid w" bw / 3 " " c, ["自动切换中文"]) } catch { - gc.LV_CN := g.AddListView("xs -LV0x10 -Multi r5 NoSortHdr Sort Grid w" bw / 3, ["自动切换中文"]) + gc.LV_CN := g.AddListView("xs -Hdr -LV0x10 -Multi r5 NoSortHdr Sort Grid w" bw / 3, ["自动切换中文"]) } addItem("CN") gc.LV_CN.ModifyCol(1, "AutoHdr") @@ -79,9 +84,9 @@ fn_switch_window(*) { c := "" } try { - gc.LV_EN := g.AddListView("yp -LV0x10 -Multi r5 NoSortHdr Sort Grid w" bw / 3 " " c, ["自动切换英文"]) + gc.LV_EN := g.AddListView("yp -Hdr -LV0x10 -Multi r5 NoSortHdr Sort Grid w" bw / 3 " " c, ["自动切换英文"]) } catch { - gc.LV_EN := g.AddListView("yp -LV0x10 -Multi r5 NoSortHdr Sort Grid w" bw / 3, ["自动切换英文"]) + gc.LV_EN := g.AddListView("yp -Hdr -LV0x10 -Multi r5 NoSortHdr Sort Grid w" bw / 3, ["自动切换英文"]) } addItem("EN") gc.LV_EN.ModifyCol(1, "AutoHdr") @@ -95,9 +100,9 @@ fn_switch_window(*) { c := "" } try { - gc.LV_Caps := g.AddListView("yp -LV0x10 -Multi r5 NoSortHdr Sort Grid w" bw / 3 " " c, ["自动切换大写锁定"]) + gc.LV_Caps := g.AddListView("yp -Hdr -LV0x10 -Multi r5 NoSortHdr Sort Grid w" bw / 3 " " c, ["自动切换大写锁定"]) } catch { - gc.LV_Caps := g.AddListView("yp -LV0x10 -Multi r5 NoSortHdr Sort Grid w" bw / 3, ["自动切换大写锁定"]) + gc.LV_Caps := g.AddListView("yp -Hdr -LV0x10 -Multi r5 NoSortHdr Sort Grid w" bw / 3, ["自动切换大写锁定"]) } addItem("Caps") gc.LV_Caps.ModifyCol(1, "AutoHdr") @@ -117,6 +122,7 @@ fn_switch_window(*) { g_1.Destroy() gc.%"LV_" from%.Delete(RowNumber) if (from != "add") { + gc.%from "_title"%.Value := SubStr(gc.%from "_title"%.Value, 1, 4) " ( " gc.%"LV_" from%.GetCount() " 个 )" config := "app_" from value := readIni(config, "") res := "" @@ -132,6 +138,7 @@ fn_switch_window(*) { if (!InStr(":" value ":", ":" RowText ":")) { gc.%"LV_" to%.Add(, RowText) + gc.%to "_title"%.Value := SubStr(gc.%to "_title"%.Value, 1, 4) " ( " gc.%"LV_" to%.GetCount() " 个 )" if (value) { writeIni(config, value ":" RowText) } else { @@ -178,6 +185,7 @@ fn_switch_window(*) { } case "CN": { + g_1.AddButton("xs Disabled w" bw, "「自动切换中文」").OnEvent("Click", fn_CN) g_1.AddButton("xs w" bw, "「自动切换英文」").OnEvent("Click", fn_EN) g_1.AddButton("xs w" bw, "「自动切换大写锁定」").OnEvent("Click", fn_Caps) g_1.AddButton("xs w" bw, "将它移除").OnEvent("Click", fn_rm) @@ -185,6 +193,7 @@ fn_switch_window(*) { case "EN": { g_1.AddButton("xs w" bw, "「自动切换中文」").OnEvent("Click", fn_CN) + g_1.AddButton("xs Disabled w" bw, "「自动切换英文」").OnEvent("Click", fn_EN) g_1.AddButton("xs w" bw, "「自动切换大写锁定」").OnEvent("Click", fn_Caps) g_1.AddButton("xs w" bw, "将它移除").OnEvent("Click", fn_rm) } @@ -192,12 +201,14 @@ fn_switch_window(*) { { g_1.AddButton("xs w" bw, "「自动切换中文」").OnEvent("Click", fn_CN) g_1.AddButton("xs w" bw, "「自动切换英文」").OnEvent("Click", fn_EN) + g_1.AddButton("xs Disabled w" bw, "「自动切换大写锁定」").OnEvent("Click", fn_Caps) g_1.AddButton("xs w" bw, "将它移除").OnEvent("Click", fn_rm) } } fn_rm(*) { g_1.Destroy() LV.Delete(RowNumber) + gc.%from "_title"%.Value := SubStr(gc.%from "_title"%.Value, 1, 4) " ( " gc.%"LV_" from%.GetCount() " 个 )" try { gc.LV_add.Add(, RowText, WinGetTitle("ahk_exe " RowText)) } @@ -342,7 +353,7 @@ fn_switch_window(*) { 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 - 添加完成后,会在下方对应列表中显示,并实时生效`n - 你也可以双击下方列表中的其中一个应用进程进行同样的操作") + g.AddEdit("ReadOnly -VScroll w" w, "如何使用这个管理面板?`n`n- 最上方的列表页显示的是当前系统正在运行的应用进程(仅前台窗口)`n- 双击列表中任意应用进程,就可以将其添加到下方任意列表中`n- 如果需要更多的进程,请点击下方的「显示更多进程」以显示后台和隐藏进程`n- 也可以点击下方的「通过输入进程名称手动添加」直接添加进程名称`n- 下方分别是中文、英文、大写锁定这三个自动切换列表`n- 在自动切换列表中的应用窗口被激活时,会自动切换到对应的输入法状态`n- 双击列表中任意应用进程,就可以将它移除或者添加到其他列表中`n- 白名单机制下,选择添加且此应用不在白名单中,则会同步添加到白名单中`n`n- 举个例子: `n - 你可以双击上方正在运行的应用进程列表中的其中一个应用进程`n - 然后在弹出的操作窗口中,选择将其添加到哪一个列表中`n - 添加完成后,会在下方对应列表中显示,并实时生效`n - 你也可以双击下方列表中的其中一个应用进程进行同样的操作") g.OnEvent("Close", fn_close) fn_close(*) { diff --git a/src/v2/menu/tray-menu.ahk b/src/v2/menu/tray-menu.ahk index bb03416..64c6582 100644 --- a/src/v2/menu/tray-menu.ahk +++ b/src/v2/menu/tray-menu.ahk @@ -76,7 +76,6 @@ fn_common(tipList, handleFn, addClickFn := "", rmClickFn := "", addFn := "") { } g := Gui("AlwaysOnTop") g.SetFont(fz, "微软雅黑") - bw := w - g.MarginX * 2 _gui := tipList.gui tab := g.AddTab3("-Wrap", tipList.tab) @@ -85,7 +84,7 @@ fn_common(tipList, handleFn, addClickFn := "", rmClickFn := "", addFn := "") { tabs := ["应用进程列表", "窗口标题", "应用进程文件所在位置"] - gc.%_gui "_LV_add"% := g.AddListView("-LV0x10 -Multi r7 NoSortHdr Sort Grid w" bw, tabs) + gc.%_gui "_LV_add"% := g.AddListView("-LV0x10 -Multi r7 NoSortHdr Sort Grid w" w, tabs) gc.%_gui "_LV_add"%.OnEvent("DoubleClick", fn_double_click) fn_double_click(LV, RowNumber) { if (addClickFn) { @@ -131,9 +130,8 @@ fn_common(tipList, handleFn, addClickFn := "", rmClickFn := "", addFn := "") { gc.%_gui "_LV_add"%.Opt("+Redraw") DetectHiddenWindows 1 - ; gc.title := g.AddText("Section w" bw, 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]) + gc.%_gui "_LV_rm_title"% := g.AddText("w" w, tipList.list) + gc.%_gui "_LV_rm"% := g.AddListView("xs -Hdr -LV0x10 -Multi r8 NoSortHdr Sort Grid w" w / 2 " " tipList.color, [tipList.list]) valueArr := StrSplit(readIni(tipList.config, ""), ":") temp := ":" gc.%_gui "_LV_rm"%.Opt("-Redraw") @@ -148,7 +146,7 @@ fn_common(tipList, handleFn, addClickFn := "", rmClickFn := "", addFn := "") { } } gc.%_gui "_LV_rm"%.Opt("+Redraw") - ; gc.title.Text := tipList.list "(" gc.%_gui "_LV_rm"%.GetCount() "项)" + gc.%_gui "_LV_rm_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) { @@ -192,7 +190,6 @@ fn_common(tipList, handleFn, addClickFn := "", rmClickFn := "", addFn := "") { 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) { @@ -212,7 +209,6 @@ fn_common(tipList, handleFn, addClickFn := "", rmClickFn := "", addFn := "") { 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) { @@ -233,7 +229,7 @@ fn_common(tipList, handleFn, addClickFn := "", rmClickFn := "", addFn := "") { fn_rm(*) { g_1.Destroy() LV.Delete(RowNumber) - ; gc.title.Text := tipList.list "(" LV.GetCount() "项)" + gc.%_gui "_LV_rm_title"%.Text := tipList.list " ( " gc.%_gui "_LV_rm"%.GetCount() " 个 )" try { gc.%_gui "_LV_add"%.Add(, RowText, WinGetTitle("ahk_exe " RowText)) } @@ -257,12 +253,12 @@ fn_common(tipList, handleFn, addClickFn := "", rmClickFn := "", addFn := "") { return g_1 } } - g.AddButton("Section yp w" bw / 2, "刷新应用进程列表").OnEvent("Click", fn_refresh) + g.AddButton("Section yp w" w / 2, "刷新应用进程列表").OnEvent("Click", fn_refresh) fn_refresh(*) { fn_close() showGui(deep) } - g.AddButton("xs w" bw / 2, "通过输入进程名称手动添加").OnEvent("Click", fn_add_by_hand) + g.AddButton("xs w" w / 2, "通过输入进程名称手动添加").OnEvent("Click", fn_add_by_hand) fn_add_by_hand(*) { if (addFn) { addFn(tipList) @@ -360,10 +356,11 @@ fn_common(tipList, handleFn, addClickFn := "", rmClickFn := "", addFn := "") { } } } - g.AddButton("xs w" bw / 2, "一键清空「" tipList.list "」").OnEvent("Click", fn_clear) + g.AddButton("xs w" w / 2, "一键清空「" tipList.list "」").OnEvent("Click", fn_clear) fn_clear(*) { createGui(fn).Show() fn(x, y, w, h) { + count := gc.%tipList.gui "_LV_rm"%.GetCount() if (gc.w.subGui) { gc.w.subGui.Destroy() gc.w.subGui := "" @@ -372,7 +369,8 @@ fn_common(tipList, handleFn, addClickFn := "", rmClickFn := "", addFn := "") { g_3.SetFont(fz, "微软雅黑") bw := w - g_3.MarginX * 2 g_3.AddText(, "确定要清空「" tipList.list "」吗?") - g_3.AddText("cRed", "请谨慎选择,一旦清空,无法恢复,只能重新一个一个添加") + g_3.AddText("cRed", "请谨慎选择,它会移除其中的 " count " 个应用进程") + g_3.AddText("cRed", "一旦清空,无法恢复,只能重新一个一个添加") g_3.AddButton("xs w" bw, "【是】我确定要清空").OnEvent("Click", yes) _g := g_3.AddButton("xs w" bw, "【否】不,我点错了") _g.OnEvent("Click", no) @@ -393,13 +391,13 @@ fn_common(tipList, handleFn, addClickFn := "", rmClickFn := "", addFn := "") { } } if (deep) { - g.AddButton("xs w" bw / 2, "显示更少进程(前台窗口)").OnEvent("Click", fn_less_window) + g.AddButton("xs w" w / 2, "显示更少进程(前台窗口)").OnEvent("Click", fn_less_window) fn_less_window(*) { fn_close() showGui("") } } else { - g.AddButton("xs w" bw / 2, "显示更多进程(后台窗口)").OnEvent("Click", fn_more_window) + g.AddButton("xs w" w / 2, "显示更多进程(后台窗口)").OnEvent("Click", fn_more_window) fn_more_window(*) { fn_close() showGui(1) @@ -409,7 +407,10 @@ fn_common(tipList, handleFn, addClickFn := "", rmClickFn := "", addFn := "") { gc.%_gui "_LV_add"%.ModifyCol(2, "AutoHdr") gc.%_gui "_LV_add"%.ModifyCol(3, "AutoHdr") tab.UseTab(2) - g.AddLink(, tipList.about) + g.AddEdit("ReadOnly -VScroll w" w, tipList.about) + if (tipList.link) { + g.AddLink(, tipList.link) + } g.OnEvent("Close", fn_close) fn_close(*) { g.Destroy() @@ -424,23 +425,25 @@ fn_white_list(*) { fn_common({ gui: "whiteListGui", config: "app_show_state", - tab: ["管理白名单", "关于"], - tip: "你首先应该点击上方的「关于」查看具体的操作说明", + tab: ["设置白名单", "关于"], + tip: "你首先应该点击上方的「关于」查看具体的操作说明 ", list: "符号显示白名单", color: "cRed", - about: '1. 如何使用这个管理面板?`n - 最上方的列表页显示的是当前系统正在运行的应用进程(仅前台窗口)`n - 双击列表中任意应用进程,就可以将其添加到「符号显示白名单」中`n - 如果需要更多的进程,请点击右下角的「显示更多进程」以显示后台和隐藏进程`n - 也可以点击右下角的「通过输入进程名称手动添加」直接添加进程名称`n - 下方是「符号显示白名单」应用进程列表,如果使用白名单机制,它将生效`n - 双击列表中任意应用进程,就可以将它移除`n`n - 白名单机制 : 只有在白名单中的应用进程窗口才会显示符号`n - 建议使用白名单机制,这样可以精确控制哪些应用进程窗口需要显示符号`n - 使用白名单机制,只需要添加常用的窗口,可以减少一些特殊窗口的兼容性问题`n - 如果选择了白名单机制,请及时添加你需要使用的应用进程到白名单中`n`n2. 如何快速添加应用进程?`n - 每次双击应用进程后,会弹出操作窗口,需要选择添加/移除或取消`n - 如果你确定当前操作不需要取消,可以在操作窗口弹出后,按下空格键快速确认', + about: '1. 如何使用这个管理面板?`n - 最上方的列表页显示的是当前系统正在运行的应用进程(仅前台窗口)`n - 双击列表中任意应用进程,就可以将其添加到「符号显示白名单」中`n - 如果需要更多的进程,请点击右下角的「显示更多进程」以显示后台和隐藏进程`n - 也可以点击右下角的「通过输入进程名称手动添加」直接添加进程名称`n - 下方是「符号显示白名单」应用进程列表,如果使用白名单机制,它将生效`n - 双击列表中任意应用进程,就可以将它移除`n`n - 白名单机制: 只有在白名单中的应用进程窗口才会显示符号`n - 建议使用白名单机制,这样可以精确控制哪些应用进程窗口需要显示符号`n - 使用白名单机制,只需要添加常用的窗口,可以减少一些特殊窗口的兼容性问题`n - 如果选择了白名单机制,请及时添加你需要使用的应用进程到白名单中`n`n2. 如何快速添加应用进程?`n - 每次双击应用进程后,会弹出操作窗口,需要选择添加/移除或取消`n - 如果你确定当前操作不需要取消,可以在操作窗口弹出后,按下空格键快速确认', + link: '相关链接: 白名单机制', addConfirm: "是否要将", addConfirm2: "添加到「符号显示白名单」中?", - addConfirm3: "添加后,白名单机制下,在此应用窗口中时,会显示符号(图片/方块/文本符号)", + addConfirm3: "添加后,白名单机制下,在此应用窗口中时,会显示符号", addConfirm4: "", rmConfirm: "是否要将", rmConfirm2: "从「符号显示白名单」中移除?", - rmConfirm3: "移除后,白名单机制下,在此应用窗口中时,不会显示符号(图片/方块/文本符号)", + rmConfirm3: "移除后,白名单机制下,在此应用窗口中时,不会显示符号", }, fn ) fn(value) { global app_show_state := ":" value ":" + gc.whiteListGui_LV_rm_title.Text := "符号显示白名单 ( " gc.whiteListGui_LV_rm.GetCount() " 个 )" restartJetBrains() } } diff --git a/src/v2/utils/app-list.ahk b/src/v2/utils/app-list.ahk index e01db69..5049eaf 100644 --- a/src/v2/utils/app-list.ahk +++ b/src/v2/utils/app-list.ahk @@ -1,30 +1,5 @@ +; 内部的默认模式应用列表,优先级最低,会被通过「设置光标获取模式」设置的配置覆盖 defaultModeList := { - ; 只有使用黑名单机制,这个禁用列表才会生效 - disable: [ - ; 规避任务栏和开始菜单中的显示问题 - "ShellExperienceHost.exe", - "StartMenuExperienceHost.exe", - ; WPS 无法使用,Office 可以正常使用 - "wps.exe", - ; HBuilderX 无法使用 - "HBuilderX.exe", - ; 微信输入法配置界面 - "wetype_update.exe", - ; PotPlayer 无法使用,没有什么输入场景,不太影响 - "PotPlayer.exe", - "PotPlayer64.exe", - "PotPlayerMini.exe", - "PotPlayerMini64.exe", - ; - "AnLink.exe", - ; - "ShareX.exe", - ; - "clipdiary-portable.exe", - ; 微软远程桌面,与 InputTip 冲突,输入时会导致其挂掉 - ; 有的有问题,有的没问题 - ; "mstsc.exe", - ], HOOK: [], UIA: [ ; Word @@ -41,6 +16,7 @@ defaultModeList := { ; 任务管理器 "Taskmgr.exe", ], + ; 先后调用 GUI 和 UIA GUI_UIA: [ ; PowerPoint(PPT) "POWERPNT.EXE", @@ -55,7 +31,6 @@ defaultModeList := { ; 微信 "Weixin.exe", ], - ; MSAA 可能有符号残留 MSAA: [ ; Excel "EXCEL.EXE", @@ -84,7 +59,7 @@ defaultModeList := { ; 邮箱 "Foxmail.exe", ], - ; 需要调用有兼容性问题的 dll 来更新光标位置的应用列表 + ; 需要调用有兼容性问题(32位)的 dll HOOK_DLL: [ ; 微信 "WeChat.exe", @@ -94,11 +69,11 @@ defaultModeList := { "powershell_ise.exe", ], ACC: [], + ; 需要使用 Java Access Bridge JAB: [] } -modeNameList := [ - "HOOK", "UIA", "GUI_UIA", "MSAA", "HOOK_DLL", "WPF", "ACC", "JAB" -] + +modeNameList := ["HOOK", "UIA", "GUI_UIA", "MSAA", "HOOK_DLL", "WPF", "ACC", "JAB"] modeListMap := { HOOK: 1, UIA: 2, diff --git a/src/v2/utils/options.ahk b/src/v2/utils/options.ahk index 7f4bccc..13d457e 100644 --- a/src/v2/utils/options.ahk +++ b/src/v2/utils/options.ahk @@ -12,5 +12,5 @@ InstallKeybdHook CoordMode 'Mouse', 'Screen' SetStoreCapsLockMode 0 -;@AHK2Exe-SetVersion 2.29.0 -currentVersion := "2.29.0" +;@AHK2Exe-SetVersion 2.30.0 +currentVersion := "2.30.0" diff --git a/src/v2/utils/var.ahk b/src/v2/utils/var.ahk index 35343fd..c695ba8 100644 --- a/src/v2/utils/var.ahk +++ b/src/v2/utils/var.ahk @@ -427,7 +427,6 @@ updateCursorMode(init := 0) { restartJetBrains() } modeList := { - disable: ":" arrJoin(defaultModeList.disable, ":") ":", HOOK: ":" arrJoin(defaultModeList.HOOK, ":") ":", UIA: ":" arrJoin(defaultModeList.UIA, ":") ":", GUI_UIA: ":" arrJoin(defaultModeList.Gui_UIA, ":") ":", @@ -448,7 +447,7 @@ updateCursorMode(init := 0) { for item in modeNameList { for v in StrSplit(%item%, ":") { - for value in modeList.OwnProps() { + for value in modeNameList { modeList.%value% := StrReplace(modeList.%value%, ":" v ":", ":") } } diff --git a/src/v2/utils/verify-file.ahk b/src/v2/utils/verify-file.ahk index 6e93333..e32cd39 100644 --- a/src/v2/utils/verify-file.ahk +++ b/src/v2/utils/verify-file.ahk @@ -80,7 +80,7 @@ checkIni() { g.SetFont(fz, "微软雅黑") bw := w - g.MarginX * 2 g.AddText(, "你真的确定要修改鼠标样式吗?") - g.AddText("cRed", "请谨慎选择,如果误点了确定,恢复鼠标样式需要以下步骤: `n 1. 点击「托盘菜单」=>「更改配置」`n 2. 将「1. 要不要同步修改鼠标样式」的值更改为 【否】") + g.AddText("cRed", "请谨慎选择,如果误点了确定,恢复鼠标样式需要以下步骤: `n 1. 点击「托盘菜单」=>「更改配置」`n 2. 将「1. 要不要同步修改鼠标样式」的值更改为【否】") g.AddButton("xs cRed w" bw, "【是】对,我很确定").OnEvent("Click", yes) yes(*) { g.Destroy() diff --git a/src/v2/version.txt b/src/v2/version.txt index f013568..6a69003 100644 --- a/src/v2/version.txt +++ b/src/v2/version.txt @@ -1 +1 @@ -2.29.0 +2.30.0