2

Я пытался автоматически запускать некоторые сценарии 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-битная версия работала отлично через папку «Автозагрузка» в течение месяцев, которые я использовал.

Я полагаю, что проблема возникла из-за того, что клавиатура-хук загружалась в память, а затем выгружалась во время сбора мусора. Были затронуты только горячие клавиши, назначенные для подключения к клавиатуре, но не назначенные с помощью RegisterHotkey.

Я использую 64-битные исполняемые файлы уже более недели, и ни один из них не вышел из строя, хотя некоторые из них реагировали немного медленно (возможно, что-то было связано с фоновыми процессами или поглощением ресурсов Chrome). Устранение или перезапуск родительских процессов taskeng.exe и svchost может решить эту проблему, так как это был единственный способ остановить перераспределение рабочего набора (все еще не удалось решить 32-разрядную проблему, и уничтожение родительского svchost создало некоторые новые проблемы). ).

[2018-10-03 Обновление: я в основном решил проблему.] Планировщик задач может задавать задачи для выполнения с разными приоритетами, но пользовательский интерфейс не показывает их.

Чтобы изменить приоритет:

  1. Экспортируйте задачу как файл XML.
  2. Отредактируйте файл XML и измените тег Приоритет. Смотрите эту страницу для списка приоритетов.
  3. Установите для StopOnIdleEnd значение "false". (Не проверял это, но это могло вызывать отставание мыши / ввода.)
  4. Импортируйте измененный файл XML как задачу, и она должна работать.

Повышение приоритета таким образом также увеличивает память и приоритет ввода / вывода.

Компиляция AHK-скриптов как 64-битных может потребоваться.

0