我一直在嘗試使用任務計劃程式自動啟動一些自動熱鍵腳本,因為它允許腳本以管理員權限運行而無需 UAC 提示。
通常,腳本會在幾個小時後失敗。當透過 UAC/explorer.exe/startup 資料夾執行時,所有這些腳本都運行了幾天。 (我見過的唯一透過任務計劃程序可靠工作的是一個簡單的任務計劃程序,它會彈出一個“Hello World”訊息框。)
透過使用 Process Explorer,我注意到 taskeng.exe 子進程的工作集大小始終會減少(從 ~3,000K 到 512K 左右),而 UAC/explorer.exe 子進程保持不變。
我嘗試使用一些 AHK 程式碼來查看它是否可以更改工作集大小:
pid := DllCall("GetCurrentProcessId")
handle := DllCall("OpenProcess", "UInt", 0x001F0FFF, "Int", 0, "Int", pid)
DllCall("SetProcessWorkingSetSize", "UInt", handle, "Int", 10000000, "Int", 20000000)
DllCall("CloseHandle", "Int", handle)
這似乎沒有什麼作用,所以我不確定是否有任何解決問題的方法。
解決方案是將可執行檔編譯為 64 位元而不是 32 位元。我以前沒有嘗試過這個,因為在我使用它的幾個月裡,32 位元版本透過啟動資料夾運行得非常好。
我相信問題源於鍵盤鉤子被加載到內存中,然後在垃圾收集期間被卸載。只有鍵盤掛鉤分配的熱鍵受到影響,使用 RegisterHotkey 分配的熱鍵不受影響。
我已經使用 64 位元執行檔一個多星期了,沒有一個失敗,儘管有些回應有點慢(可能與後台進程或 Chrome 佔用資源有關)。終止或重新啟動父 taskeng.exe 和 svchost 進程可能會解決此問題,因為這是我發現停止工作集重新分配的唯一方法(仍然沒有解決 32 位元問題,並且終止父 svchost 會產生一些新問題)。
[2018-10-03更新:我已經基本解決了這個問題。
要更改優先順序:
- 將任務匯出為 XML 檔案。
- 編輯 XML 檔案並更改優先標籤。看這一頁以獲得優先順序清單。
- 將 StopOnIdleEnd 設定為「false」。 (尚未對此進行測試,但它可能會導致滑鼠/輸入滯後。)
- 將修改後的 XML 檔案作為任務導入,它應該可以工作。
透過這種方式提高優先權也會提高記憶體和 I/O 優先權。
可能仍需要將 AHK 腳本編譯為 64 位元。