Тема: AHK: Экран выбора пользователя: отключение дисплея
Захотелось автоматически отключать дисплей при простое на локальном компьютере (Widows XP).
Для пользователей это сделать просто: Свойства экрана --> Питание --> Отключение дисплея.
Когда ни один пользователь не выполнил вход в систему, действуют настройки:
[HKEY_USERS\.DEFAULT\Control Panel\Desktop]
"ScreenSaveTimeOut"="600"
"ScreenSaveActive"="1"
"SCRNSAVE.EXE"="logon.scr"То есть в реестре можно задать нужную программу и время простоя в секундах.
Но если хотя бы один пользователь выполнил вход в систему, программа-заставка не будет запущена. Зато можно воспользоваться планировщиком (спасибо smaharbA за подсказку).
Воспользуемся скриптом от YMP: AHK: Выключение монитора по горячей клавише
HWND_BROADCAST = 0xFFFF
WM_SYSCOMMAND = 0x0112
SC_MONITORPOWER = 0xF170
DllCall("SendMessage", "UInt", HWND_BROADCAST
, "UInt", WM_SYSCOMMAND
, "UInt", SC_MONITORPOWER
, "Int", 2)Правда такой скрипт будет отключать дисплей в любом случае, а меня интересует только экран выбора пользователя. Чтобы скрпит понимал, требуется ли отключить дисплей в данный момент, хорошо бы знать идентификатор активного окна или имя процесса. Однако, мои попытки определить их при помощи команды WinGet не увенчались успехом. Зато MouseGetPos позволяет определить координаты курсора. Причём на экране выбора пользователя эти координаты принимают аномальные (зато постоянные) значения. Если определять положение курсора, запустив скрипт от имени любого пользователя, то X=9302696, Y=2010364338. Если от имени NT AUTHORITY\SYSTEM, то X=371720, Y=510. На других компьютерах и ОС не проверял, но X и Y точно не зависят от разрешения экрана.
В итоге получаем следующий скрипт:
MouseGetPos, X, Y
If (X > A_ScreenWidth) OR (Y > A_ScreenHeight)
{
HWND_BROADCAST = 0xFFFF
WM_SYSCOMMAND = 0x0112
SC_MONITORPOWER = 0xF170
DllCall("SendMessage", "UInt", HWND_BROADCAST
, "UInt", WM_SYSCOMMAND
, "UInt", SC_MONITORPOWER
, "Int", 2)
}Компилируем и добавляем в Назначенные задания, чтобы запускался от имени администратора при простое 1 мин.

