Как заставить пакетный файл окна определять, когда включена заставка?

Как запрограммировать пакетную программу, чтобы определить, работает ли заставка, или пользователь заснул, или заблокировал компьютер?

В bash в Ubuntu Linux я использую код: /gnome-screensaver-command -q | grep "is active", чтобы определить, работает ли заставка.

Примечание. Я не ищу рекомендаций по книгам, инструментам, программным библиотекам...

Если нет лучшего подхода, я работаю над этим скриптом, чтобы искать запущенные процессы. Но я должен найти имя процесса заставки.

@echo off
set pn=%1
echo looking for %pn%
tasklist /FI "IMAGENAME eq %pn%" 2>NUL | find /I /N "%pn%">NUL
if %ERRORLEVEL%==0 (
    echo Found program running
) else (
    echo NOT FOUND running  
)

person jdl    schedule 24.12.2020    source источник
comment
Ваша предыдущая версия этого вопроса была закрыта как запрос на рекомендацию, потому что (необъяснимо) нет близкой причины для запроса кода.   -  person SomethingDark    schedule 25.12.2020


Ответы (2)


Имя процесса заставки зависит от того, какая заставка запущена, но оно всегда должно заканчиваться на .scr.

tasklist | find ".scr" >nul
if %errorlevel% EQU 0 (
    echo Screensaver is running
) else (
    echo Screensaver is not running
)

Заставки Windows 10 по умолчанию имеют следующие имена процессов:

3D Text - ssText3d.scr
Blank   - scrnsave.scr
Bubbles - Bubbles.scr
Mystify - Mystify.scr
Photos  - PhotoScreensaver.scr
Ribbons - Ribbons.scr

Когда компьютер заблокирован, запускается процесс LogonUI.exe.

tasklist | find "LogonUI.exe"
if %errorlevel% EQU 0 (
    echo Computer is locked
) else (
    echo Computer is unlocked
)
person SomethingDark    schedule 25.12.2020
comment
хорошо... я заблокировал компьютер.... должна ли эта экранная заставка вывода скрипта работать? - person jdl; 25.12.2020
comment
@jdl - Если заставка запускается, когда компьютер заблокирован, а скрипт выполняется в цикле (потому что этот фрагмент запускается только один раз, и я не знаю, как вы запустите скрипт после блокировки компьютер), то он должен обнаружить заставку. - person SomethingDark; 25.12.2020
comment
он есть в планировщике задач и срабатывает каждую минуту - person jdl; 25.12.2020
comment
всегда говорит, что заставка не работает каждую минуту ... и я просматриваю это удаленно через SSH - person jdl; 25.12.2020
comment
Включена ли заставка? Я знаю, что при блокировке компьютера экранная заставка не включается автоматически. Попробуйте запустить tasklist и посмотрите, есть ли что-нибудь похожее на скринсейвер. - person SomethingDark; 26.12.2020
comment
мы можем обнаружить, когда компьютер заблокирован? это отличается от скринсейвера linux... т.е. вы не обязательно видите скринсейвер... просто пользователь был усыплен - person jdl; 26.12.2020
comment
когда я делаю TASKLIST /FI imagename eq pad /svc для поиска блокнота... это не сработает. Мне нужно сделать TASKLIST /FI imagename eq note* /svc. Я должен иметь первую часть имени, чем звезда, чтобы получить список. Я бы получил это: ИНФОРМАЦИЯ: не выполняются задачи, соответствующие указанным критериям. - person jdl; 26.12.2020
comment
Не используйте /FI вообще; просто tasklist | find "note" - person SomethingDark; 26.12.2020
comment
Давайте продолжим обсуждение в чате. - person jdl; 26.12.2020
comment
@SomethingDark : screensaver-y? В отличие от screensweet-y, возможно? - person Magoo; 27.12.2020

@echo off 

pushd "%__AppDir__%"
title <nul & title ..\%~nx0
setlocal EnableDelayedExpansion
set "_Reg_Key=HKCU\Control Panel\Desktop"

:loop
for /f skip^=2tokens^=2* %%i in (
';2^>^&1 reg.exe query "!_Reg_Key!" /v SCRNSAVE.EXE
')do if /i "%%~xj" == ".scr" (set "_scr_svr=%%~nxj") else (
     echo/[ !date! ^| !time:~0,8! ] Screen Saver: Disable " - - - - -!"
     rem./ With ScreenSaver is disabled no status is need && goto:next
    )

for /f skip^=2tokens^=2* %%i in (
';2^>nul reg query "!_Reg_Key!" /v ScreenSaveActive')do if %%j equ 1 (
      2>nul tasklist.exe/svc /fo list|find.exe/i "!_scr_svr!">nul && (
      echo/[ !date! ^| !time:~0,8! ] Screen Saver: Running "!_scr_svr!"
    ) || (
      echo/[ !date! ^| !time:~0,8! ] Screen Saver: Enabled "!_scr_svr!"
      echo/[ !date! ^| !time:~0,8! ] Screen Saver: Stopped "!_scr_svr!")
    )

:next
2>nul tasklist.exe/svc /fo list|find.exe/i "LogonUI.exe" >nul && (
         echo/[ !date! ^| !time:~0,8! ] Work Station: Locked  "!ComputerName!"
    ) || echo/[ !date! ^| !time:~0,8! ] Work Station: Logged  "!ComputerName!"

<con: set "_scr_svr=" & >nul timeout/t 10 /nobreak & goto :Loop  

1. Используйте Reg Query, чтобы узнать, включена ли в данный момент экранная заставка включена.

for /f skip^=2tokens^=2* %%i in (
';2^>nul reg query "!_Reg_Key!" /v ScreenSaveActive')do if %%j equ 1 (

2. Если экранная заставка в настоящее время включена, используйте дополнительный Reg Query, чтобы получить и сохранить The_Name + .Extension

3. Избегайте частичной строки в | find ".scr" и используйте find /i "The_Full_File_Name.scr" для нечувствительного к регистру и для совпадений some_name.scr ≠≠ Some_Name.SCR и some_name.scr == Some_Name.SCR.

  • Примечание 1 При использовании tasklist для списка задач с |find ".scr" любой строкой, присутствующей в имени, которая также содержит строку .str (только строчные буквы), это также будет указано независимо от того, запущена или нет заставка.

  • Примечание 2 Если длина символов в имени screen_saver_long_name.scr (включая расширение) больше 25 с tasklist | find ".src", вы никогда не отфильтруете/найдёте этот файл , потому что tasklist (без /flag) имеет в выводе только 26 символов (, заканчивающихся на.)

  • Примечания:3 Для процесса списка, в котором запущена экранная заставка с именем, например Security Screensaver NG.scr, используйте tasklist /svc /fo list

4. Используйте цикл и следите за любыми изменениями, которые могут произойти в любое время в процессе цикла, постоянно запрашивая значение реестра.


Возможный статус и выходы:

  • Экранная заставка включена и не запущена, но пользователь вошел в систему:
[ Sun 12/27/2020 | 23:26:17 ] Screen Saver: Enabled "Fliqlo.scr"
[ Sun 12/27/2020 | 23:26:17 ] Screen Saver: Stopped "Fliqlo.scr"
[ Sun 12/27/2020 | 23:26:17 ] Work Station: Logged  "LAME_SLUG"
  • Экранная заставка включена и работает, но рабочая станция заблокирована:
[ Sun 12/27/2020 | 27:09:07 ] Screen Saver: Enabled "Fliqlo.scr"
[ Sun 12/27/2020 | 27:09:07 ] Screen Saver: Running "Fliqlo.scr"
[ Sun 12/27/2020 | 27:09:07 ] Work Station: Locked  "LAME_SLUG"
  • Заставка включена, не работает, но пользователь вошел в систему:
[ Sun 12/27/2020 | 25:26:21 ] Screen Saver: Enabled "Fliqlo.scr"
[ Sun 12/27/2020 | 25:26:21 ] Screen Saver: Running "Fliqlo.scr"
[ Sun 12/27/2020 | 25:26:21 ] Work Station: Logged  "LAME_SLUG"
  • Экранная заставка включена и не запущена, рабочая станция заблокирована:
[ Sun 12/27/2020 | 25:15:28 ] Screen Saver: Enabled "Fliqlo.scr"
[ Sun 12/27/2020 | 25:15:28 ] Screen Saver: Stopped "Fliqlo.scr"
[ Sun 12/27/2020 | 25:15:28 ] Work Station: locked  "LAME_SLUG"
  • Экранная заставка отключена not running, но пользователь вошел в систему:
[ Sun 12/27/2020 | 22:51:46 ] Screen Saver: Disable " - - - - -"
[ Sun 12/27/2020 | 22:51:46 ] Work Station: Logged  "LAME_SLUG"
  • Экранная заставка отключена not running, но рабочая станция заблокирована:
[ Sun 12/27/2020 | 22:44:11 ] Screen Saver: Disable " - - - - -"
[ Sun 12/27/2020 | 22:44:11 ] Work Station: Locked  "LAME_SLUG"

  • Чтобы ограничить до 10 циклов, с 10 интервалами/тайм-аутом по 10 секунд каждый
@echo off 

set/a "_c+=0"
pushd "%__AppDir__%"
title <nul & title ..\%~nx0
setlocal EnableDelayedExpansion
set "_Reg_Key=HKCU\Control Panel\Desktop"

:loop
for /f ^skip^=2tokens^=2* %%i in (
';2^>^&1 reg.exe query "!_Reg_Key!" /v SCRNSAVE.EXE
')do if /i "%%~xj" == ".scr" (set "_scr_svr=%%~nxj") else (
     echo/[ !date! ^| !time:~0,8! ] Screen Saver: Disable " - - - - -!"
     rem./ With ScreenSaver is disabled no status is need && goto:next
    )

for /f skip^=2tokens^=2* %%i in (
';2^>nul reg query "!_Reg_Key!" /v ScreenSaveActive')do if %%j equ 1 (
      2>nul tasklist.exe/svc /fo list|find.exe/i "!_scr_svr!">nul && (
      echo/[ !date! ^| !time:~0,8! ] Screen Saver: Running "!_scr_svr!"
    ) || (
      echo/[ !date! ^| !time:~0,8! ] Screen Saver: Enabled "!_scr_svr!"
      echo/[ !date! ^| !time:~0,8! ] Screen Saver: Stopped "!_scr_svr!")
    )

:next
2>nul tasklist.exe/svc /fo list|find.exe/i "LogonUI.exe" >nul && (
         echo/[ !date! ^| !time:~0,8! ] Work Station: Locked  "!ComputerName!"
    ) || echo/[ !date! ^| !time:~0,8! ] Work Station: Logged  "!ComputerName!"

if !_c! leq 9 (
      set /a "_c+=1" && set "_scr_svr=" && >nul timeout/t 10 & goto:Loop
    ) else popd && endlocal && goto:eof
person It Wasn't Me    schedule 28.12.2020