Everything 是個(gè)不錯(cuò)的軟件童本,許多人應(yīng)該都將它列為開機(jī)啟動(dòng)的程序之一。它本身提供了熱鍵功能曲管,包括新建窗口簇爆、顯示窗口和切換窗口,通過切換窗口用熱鍵控制激活和隱藏 Everything 在實(shí)際中足夠了(如下圖)视译,所以下面這個(gè)腳本并不很必要嬉荆。不過如果用類似的方式控制 Total Commander 效果就出來了,它較小眾所以這里不作為例子酷含。
![Everything 選項(xiàng)對(duì)話框](http://amnesiac10.github.io/assets/images/20140813000.png)
在啟動(dòng) Everything 后鄙早,用一個(gè)熱鍵可激活其搜索窗口(當(dāng)最小化或隱藏時(shí))、隱藏其窗口(當(dāng)活躍時(shí))椅亚。
腳本
; 環(huán)境:WIN_XP; AutoHotkey 1.1.15.00 Unicode; Everything V1.3.3.658b (x86)
EverythingExe := "d:\Software\Everything\Everything-1.3.3.658b.x86.exe"
F1:: ; 打開/最小化/激活 Everything
IfWinActive, ahk_class EVERYTHING ; 窗口當(dāng)前活躍蝶锋,關(guān)閉(隱藏到后臺(tái)了)。
{
WinClose
return
}
DetectHiddenWindows, On
IfWinNotExist, ahk_class EVERYTHING_TASKBAR_NOTIFICATION ; 未啟動(dòng)什往。
{
Run, %EverythingExe%,, Max
WinWait, ahk_class EVERYTHING_TASKBAR_NOTIFICATION,, 2
if (ErrorLevel = 1)
{
MsgBox, 4112, 錯(cuò)誤, Everything啟動(dòng)失敗扳缕。
return
}
}
IfWinNotExist, ahk_class EVERYTHING ; 已啟動(dòng)但不存在窗口,說明在后臺(tái)别威。
{
PostMessage, 0x312, 0, 0x700000,, ahk_class EVERYTHING_TASKBAR_NOTIFICATION
WinWait, ahk_class EVERYTHING,, 1
}
IfWinNotActive, ahk_class EVERYTHING ; 窗口不活躍躯舔,激活。
WinActivate
return
分析
由于 Everything 可能未啟動(dòng)省古、啟動(dòng)了未激活(即最小化或隱藏)或激活狀態(tài)粥庄,所以先理順?biāo)悸罚?/p>
- 若 Everything 窗口活躍,則退出(或隱藏)豺妓;
- 若 Everything 窗口不存在惜互,有兩種情況;
當(dāng) Everything 窗口不存在時(shí),有可能:
- Everything 未啟動(dòng)尺铣,則啟動(dòng)并激活护蝶;
- Everything 已啟動(dòng),則激活窗口坑鱼;
這里,不論是否已啟動(dòng)都需要激活窗口絮缅,所以合并到一起鲁沥。接著重點(diǎn)說說 EVERYTHING_TASKBAR_NOTIFICATION 這個(gè)窗口,怎么來的呢耕魄?
![Microsoft Spy++ 進(jìn)程列表](http://amnesiac10.github.io/assets/images/20140813001.png)
打開 Microsoft Spy++画恰,在 Everything 進(jìn)程中可以看到這個(gè)隱藏窗口(應(yīng)該在選項(xiàng)中選中后臺(tái)運(yùn)行才會(huì)存在,若不選則關(guān)閉時(shí)會(huì)退出)吸奴。
前面已經(jīng)設(shè)置“切換窗口熱鍵”為 F1允扇,這里監(jiān)視這個(gè)隱藏窗口的消息后按下 F1:
![Microsoft Spy++ 消息窗口](http://amnesiac10.github.io/assets/images/20140813002.png)
Everything 的窗口出現(xiàn)了缠局,同時(shí)消息窗口中也顯示了隱藏窗口處理的消息,很幸運(yùn)第一條即是我們需要的蔼两。其中 P 表示 PostMessage甩鳄,后面包含了參數(shù)(屬性窗口中查看更方便,需要注意這些值都是十六進(jìn)制额划,作為命令參數(shù)時(shí)需加“0x”)妙啃,因此得到這條命令:
PostMessage, 0x312, 0, 0x700000,, ahk_class EVERYTHING_TASKBAR_NOTIFICATION ; 必須開啟隱藏窗口檢測(cè)才有效。
0x312 表示 WM_HOTKEY俊戳,相關(guān)說明請(qǐng)參考 WM_HOTKEY 資料頁揖赴。
剛才關(guān)于消息的來源介紹時(shí)只是蜻蜓點(diǎn)水,詳細(xì)說明需要在另一篇專門文章了抑胎,若有興趣可先參考幫助中的消息指南燥滑。此外,后臺(tái)運(yùn)行的程序都會(huì)有隱藏窗口阿逃,有了窗口才能與系統(tǒng)铭拧、用戶或其他進(jìn)程交互(可能說法不夠嚴(yán)謹(jǐn),請(qǐng)專業(yè)人士斧正)恃锉。AutoHotkey 腳本運(yùn)行時(shí)也有(即使不包含圖形界面)搀菩,這個(gè)隱藏窗口的妙用有機(jī)會(huì)再聊。
其他
我的實(shí)際腳本
我實(shí)際使用的腳本與上面有些差異:
- 有了 Listary 后破托,Everything 不經(jīng)常啟動(dòng)了(所以不隨系統(tǒng)啟動(dòng))肪跋;
- 在啟動(dòng)前要設(shè)置 Everything.ini 以在 TC 中打開文件/文件夾路徑;
- 定制了一些僅用于 Everything 的熱鍵土砂,用于快速執(zhí)行常用過濾等州既;
由于各人習(xí)慣有異、實(shí)現(xiàn)的方法都比較簡(jiǎn)單且適用性不大萝映,這里不發(fā)了吴叶。
Total Commander 熱鍵
盡管通過前面的內(nèi)容應(yīng)該能自己寫出來,想想還是放在這里吧(這個(gè)更簡(jiǎn)單)锌俱。
TotalCommanderExe := "d:\Software\totalcmd\TOTALCMD.EXE"
Return
F1:: ; 打開/最小化/激活TC
IfWinNotExist, ahk_class TTOTAL_CMD
{
Run, %TotalCommanderExe%,, Max
}
Else
{
IfWinNotActive
{
WinMaximize
WinActivate
}
else
{
WinGet, TcWinState, MinMax, A
If (TcWinState = 1)
WinMinimize
Else
WinMaximize
}
}
Return