#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 }