我一直在尝试使用任务计划程序自动启动一些 Auto-HotKey 脚本,因为它允许脚本以管理员权限运行而无需 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 位。