Я пытаюсь автоматически запускать некоторые скрипты Auto-HotKey с помощью планировщика заданий, поскольку он позволяет запускать скрипты с правами администратора без запроса UAC.
Обычно скрипты терпят неудачу через несколько часов. При запуске через папку UAC/explorer.exe/startup все эти скрипты работают несколько дней. (Единственный, который я видел работающим надежно через планировщик заданий, — это простой скрипт, который выводит всплывающее окно с сообщением «Hello World».)
Используя Process Explorer, я заметил, что у дочерних процессов taskeng.exe размер рабочих наборов всегда уменьшался (примерно с 3000 КБ до 512 КБ), в то время как у дочерних процессов 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-битная версия прекрасно работала через папку «Автозагрузка» в течение месяцев, которые я ее использовал.
Я считаю, что проблема возникла из-за того, что keyboard-hook загружался в память, а затем выгружался во время сборки мусора. Это затронуло только горячие клавиши, назначенные keyboard-hook, а не те, которые были назначены с помощью RegisterHotkey.
Я использую 64-битные исполняемые файлы уже больше недели, и ни один из них не дал сбоев, хотя некоторые немного медленно реагировали (возможно, это связано с фоновыми процессами или потреблением ресурсов Chrome). Завершение или перезапуск родительских процессов taskeng.exe и svchost может решить эту проблему, поскольку это единственный способ, который я нашел, чтобы остановить перераспределение рабочего набора (все еще не решило проблему 32-битных, а завершение родительского svchost создало несколько новых проблем).
[Обновление 03.10.2018: в целом я решил проблему.] Планировщик заданий может устанавливать задачи для выполнения с разными приоритетами, но пользовательский интерфейс этого не отображает.
Чтобы изменить приоритет:
- Экспортируйте задачу как XML-файл.
- Отредактируйте XML-файл и измените тег Priority. Смотретьэта страницадля списка приоритетов.
- Установите StopOnIdleEnd на «false». (Я не проверял это, но это могло вызывать задержку мыши/ввода.)
- Импортируйте измененный XML-файл как задачу, и это должно заработать.
Повышение приоритета таким образом также увеличивает приоритет памяти и ввода-вывода.
Может потребоваться компиляция скриптов AHK как 64-битных.