熱鍵的效果:
1、Chrome沒打開時,打開Chrome
2、Chrome已打開,未激活時,則激活Chrome
3、Chrome已激活,則隱藏Chrome
本來這種功能對AutoHotkey來說非常簡單,
但是在激活Chrome或FireFox瀏覽器的時候卻總是無效,
經朋友指點是有些程序的窗口會存在N個子窗口,
所以增加了尋找主窗口HWND的過程,就可以正常激活了。
完整代碼如下:
#a::hyf_onekeyWindow("d:\Chrome\Chrome.exe", "Chrome_WidgetWin_1", "\S") ;注意修改Chrome路徑
hyf_onekeyWindow(exePath, titleClass := "", titleReg := "")
{ ;有些窗口用Ahk_exe exeName判斷不准確,所以自定義個titleClass
SplitPath, exePath, exeName, , , noExt
If !hyf_processExist(exeName)
{
;hyf_tooltip("啟動中,請稍等...")
Run,% exePath
;打開后自動運行 TODO
funcName := noExt . "_runDo"
If IsFunc(funcName)
{
;hyf_tooltip("已自動執行函數:" . funcName)
Func(funcName).Call()
}
Else If titleClass
{
WinWait, Ahk_class %titleClass%, , 1
WinActivate Ahk_class %titleClass%
}
}
Else If WinActive("Ahk_exe " . exeName)
{
funcName := noExt . "_hideDo"
If IsFunc(funcName)
Func(funcName).Call()
WinHide
;激活鼠標所在窗口 TODO
MouseGetPos, , , idMouse
WinActivate Ahk_id %idMouse%
}
Else
{
If titleReg
titleClass := "Ahk_id " . hyf_getMainIDOfProcess(exeName, titleClass, titleReg)
Else If titleClass
titleClass := "Ahk_class " . titleClass
Else
titleClass := "Ahk_exe " . exeName
WinShow %titleClass%
WinActivate %titleClass%
funcName := noExt . "_activeDo"
If IsFunc(funcName)
{
;hyf_tooltip("已自動執行函數:" . funcName)
Func(funcName).Call()
}
}
}
hyf_processExist(n) ;判斷進程是否存在(返回PID)
{ ;n為進程名
Process, Exist, %n% ;比IfWinExist可靠
Return ErrorLevel
}
hyf_tooltip(str, t := 1, ExitScript := 0, x := "", y := "") ;提示t秒並自動消失
{
t *= 1000
ToolTip, %str%, %x%, %y%
SetTimer, hyf_removeToolTip, -%t%
If ExitScript
{
Gui, Destroy
Exit
}
}
hyf_getMainIDOfProcess(exeName, cls, titleReg := "") ;獲取類似chrome等多進程的主程序ID
{
DetectHiddenWindows, On
WinGet, arr, List, Ahk_exe %exeName%
Loop,% arr
{
n := arr%A_Index%
WinGetClass, classLoop, Ahk_id %n%
;MsgBox,% A_Index . "/" . arr . "`n" . classLoop . "`n" . cls
If (classLoop = cls)
{
If !StrLen(titleReg) ;不需要判斷標題
Return n
WinGetTitle, titleLoop, Ahk_id %n%
;MsgBox,% A_Index . "/" . arr . "`n" . classLoop . "`n" . titleLoop
If (titleLoop ~= titleReg)
Return n
}
Continue
}
Return False
}
hyf_removeToolTip() ;清除ToolTip
{
ToolTip
}
