#Requires AutoHotkey v2.0
#SingleInstance Force
; === 全局变量:记录上一个活动窗口 ===
global lastActiveWindow := 0
; === Cherry Studio (启用防闪烁模式) ===
!`::
{
ToggleWindow("Cherry Studio ahk_exe Cherry Studio.exe", "D:\Software\Cherry Studio\Cherry Studio.exe", "", false, true)
}
; === Notion ===
!1::
{
ToggleWindow("ahk_exe Notion.exe", "C:\Users\Chen\AppData\Local\Programs\Notion\Notion.exe", "命令搜索")
}
; === Telegram ===
!2::
{
ToggleWindow("ahk_exe Telegram.exe", "D:\Software\Telegram\Telegram.exe")
}
; === 微信 ===
!3::
{
ToggleWindow("微信 ahk_exe Weixin.exe", "D:\Software\WeChat\Weixin\Weixin.exe")
}
!=::
{
ToggleWindow("Clash for Windows ahk_exe Clash for Windows.exe", "D:\Software\Clash\Clash for Windows.exe")
}
; === 终极融合版窗口切换函数 ===
ToggleWindow(winTitle, runPath, excludeTitle := "", minimizeMode := false, antiFlashMode := false)
{
DetectHiddenWindows True
SetTitleMatchMode 2
; === 1. ID 缓存池 + 时间戳记录 ===
static windowIDs := Map()
static lastShowTime := Map()
targetID := 0
; 先看缓存里有没有有效的 ID
if windowIDs.Has(winTitle) {
cachedID := windowIDs[winTitle]
if WinExist("ahk_id " cachedID) {
targetID := cachedID
} else {
windowIDs.Delete(winTitle)
lastShowTime.Delete(winTitle)
}
}
; 如果缓存没找到,尝试现抓一个
if (targetID == 0) {
targetID := GetCleanWindowID(winTitle, excludeTitle)
if (targetID) {
windowIDs[winTitle] := targetID
}
}
; === 2. 极速隐藏逻辑(优化版防闪烁) ===
if (targetID && WinActive("ahk_id " targetID)) {
; 🔥 智能防闪烁:只在极快速切换时延迟
if (antiFlashMode) {
currentTime := A_TickCount
if (lastShowTime.Has(winTitle)) {
elapsedTime := currentTime - lastShowTime[winTitle]
; 只有在 500ms 内的极快速切换才延迟
if (elapsedTime < 500) {
Sleep(900 - elapsedTime)
}
}
}
; === 🎯 改进点:直接切换到上一个窗口,不发送按键 ===
if (minimizeMode) {
WinMinimize "ahk_id " targetID
} else {
WinHide "ahk_id " targetID
; 🔥 核心改动:激活上一个记录的窗口,而不是发送 Alt+Esc
global lastActiveWindow
if (lastActiveWindow && WinExist("ahk_id " lastActiveWindow)) {
try WinActivate "ahk_id " lastActiveWindow
} else {
; 如果没有记录或窗口已关闭,激活桌面或下一个窗口
try WinActivate "ahk_class WorkerW" ; 桌面
}
}
return
}
; === 3. 强力唤醒逻辑 ===
; 🔥 显示窗口前,记录当前活动窗口
global lastActiveWindow
try {
lastActiveWindow := WinGetID("A")
}
try {
Run runPath
}
if WinWait(winTitle, , 1, excludeTitle) {
newID := GetCleanWindowID(winTitle, excludeTitle)
if (newID) {
windowIDs[winTitle] := newID
targetSelector := "ahk_id " newID
if (minimizeMode) {
WinRestore targetSelector
} else {
WinShow targetSelector
}
WinActivate targetSelector
; 🔥 记录显示时间
if (antiFlashMode) {
lastShowTime[winTitle] := A_TickCount
}
}
}
}
; === 辅助函数:获取干净的窗口 ID ===
GetCleanWindowID(winTitle, excludeTitle) {
try {
idList := WinGetList(winTitle)
for thisID in idList {
try {
thisTitle := WinGetTitle("ahk_id " thisID)
if (thisTitle != "" && (excludeTitle == "" || !InStr(thisTitle, excludeTitle))) {
return thisID
}
}
}
}
return 0
}
requires AutoHotkey v2.0 singleinstance Force
; = 全局变量:记录上一个活动窗口 = global lastActiveWindow := 0
; = Cherry Studio (启用防闪烁模式) = !`:: { ToggleWindow(“Cherry Studio ahk_exe Cherry Studio.exe”, “D:\Software\Cherry Studio\Cherry Studio.exe”, "", false, true) }
; = Notion = !1:: { ToggleWindow(“ahk_exe Notion.exe”, “C:\Users\Chen\AppData\Local\Programs\Notion\Notion.exe”, “命令搜索”, true) }
; = Telegram = !2:: { ToggleWindow(“ahk_exe Telegram.exe”, “D:\Software\Telegram\Telegram.exe”) }
; = 微信 = !3:: { ToggleWindow(“微信 ahk_exe Weixin.exe”, “D:\Software\WeChat\Weixin\Weixin.exe”) }
; = 终极融合版窗口切换函数 = ToggleWindow(winTitle, runPath, excludeTitle := "", minimizeMode := false, antiFlashMode := false) { DetectHiddenWindows True SetTitleMatchMode 2
; === 1. ID 缓存池 + 时间戳记录 ===
static windowIDs := Map()
static lastShowTime := Map()
targetID := 0
; 先看缓存里有没有有效的 ID
if windowIDs.Has(winTitle) {
cachedID := windowIDs[winTitle]
if WinExist("ahk_id " cachedID) {
targetID := cachedID
} else {
windowIDs.Delete(winTitle)
lastShowTime.Delete(winTitle)
}
}
; 如果缓存没找到,尝试现抓一个
if (targetID == 0) {
targetID := GetCleanWindowID(winTitle, excludeTitle)
if (targetID) {
windowIDs[winTitle] := targetID
}
}
; === 2. 极速隐藏逻辑(优化版防闪烁) ===
if (targetID && WinActive("ahk_id " targetID)) {
; 🔥 智能防闪烁:只在极快速切换时延迟
if (antiFlashMode) {
currentTime := A_TickCount
if (lastShowTime.Has(winTitle)) {
elapsedTime := currentTime - lastShowTime[winTitle]
; 只有在 500ms 内的极快速切换才延迟
if (elapsedTime < 500) {
Sleep(900 - elapsedTime)
}
}
}
; === 🎯 改进点:直接切换到上一个窗口,不发送按键 ===
if (minimizeMode) {
WinMinimize "ahk_id " targetID
} else {
WinHide "ahk_id " targetID
; 🔥 核心改动:激活上一个记录的窗口,而不是发送 Alt+Esc
global lastActiveWindow
if (lastActiveWindow && WinExist("ahk_id " lastActiveWindow)) {
try WinActivate "ahk_id " lastActiveWindow
} else {
; 如果没有记录或窗口已关闭,激活桌面或下一个窗口
try WinActivate "ahk_class WorkerW" ; 桌面
}
}
return
}
; === 3. 强力唤醒逻辑 ===
; 🔥 显示窗口前,记录当前活动窗口
global lastActiveWindow
try {
lastActiveWindow := WinGetID("A")
}
try {
Run runPath
}
if WinWait(winTitle, , 1, excludeTitle) {
newID := GetCleanWindowID(winTitle, excludeTitle)
if (newID) {
windowIDs[winTitle] := newID
targetSelector := "ahk_id " newID
if (minimizeMode) {
WinRestore targetSelector
} else {
WinShow targetSelector
}
WinActivate targetSelector
; 🔥 记录显示时间
if (antiFlashMode) {
lastShowTime[winTitle] := A_TickCount
}
}
}
}
; = 辅助函数:获取干净的窗口 ID = GetCleanWindowID(winTitle, excludeTitle) { try { idList := WinGetList(winTitle) for thisID in idList { try { thisTitle := WinGetTitle(“ahk_id ” thisID) if (thisTitle != "" && (excludeTitle == "" || !InStr(thisTitle, excludeTitle))) { return thisID } } } } return 0 }