如何让 window 的批处理文件检测屏幕保护程序何时打开?

How to have window's batch file detect when the screensaver is on?

如何编写批处理程序来确定屏幕保护程序是否处于 运行 或用户是否进入睡眠状态或锁定计算机?

In bash in 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  
)

屏保进程的名称因屏保 运行 而异,但应始终以 .scr.

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

默认Windows10个屏保进程名称如下:

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
)
@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 <b><i>"!_Reg_Key!" /v ScreenSaveActive</i></b>')do <b><i>if %%j equ 1 </i></b>(

2. 如果屏幕保护程序当前 已启用,请使用额外的 Reg Query获取并保存<i><b>The_Name + .Extension</i></b>

3. 避免 | find ".scr" 中的部分字符串并使用 find <b> <i>/i "The_Full_File_Name.scr"</b></i> 不区分大小写和匹配 some_name.scr <b> ≠≠<i>Some_Name.SCR</i></b>some_name.scr<b>==<i> Some_Name.SCR</i></b>

  • Obs.1 在使用 tasklist 的任务列表中 |find ".scr" 名称中包含字符串 .str 的任何字符串(仅限小写),这也将被列出是否是屏幕保护程序可能是也可能不是 运行.

  • Obs.2如果screen_saver_long_name.scr名称中的字符长度(包括扩展名)大于25,用tasklist | find ".src",你永远不会filter/found这个文件,因为tasklist(没有任何 <b>/flag</b>) 在输出中只有 26 个字符长度 (, 结尾为.)

  • Obs.:3 对于某些屏幕保护程序名称如 Security Screensaver NG.scr 的列表进程是 运行,使用tasklist /svc /fo list

4.使用循环,在循环过程中随时保持监听可感知的变化,不断查询注册表值


可能的状态和输出:

  • 屏幕保护程序已启用但未 运行,但用户已登录:
[ 2020 年 12 月 27 日星期日 | 23:26:17 ] 屏幕保护程序:已启用 "Fliqlo.scr"
[ 2020 年 12 月 27 日星期日 | 23:26:17 ] 屏幕保护程序:已停止 "Fliqlo.scr"
[ 2020 年 12 月 27 日星期日 | 23:26:17 ] 工作站:记录 "LAME_SLUG"</pre>
  • 屏幕保护程序已启用且 运行,但工作站已锁定:
[ 2020 年 12 月 27 日星期日 | 27:09:07 ] 屏幕保护程序:已启用 "Fliqlo.scr"
[ 2020 年 12 月 27 日星期日 | 27:09:07 ] 屏幕保护程序:运行 "Fliqlo.scr"
[ 2020 年 12 月 27 日星期日 | 27:09:07 ] 工作站:锁定 "LAME_SLUG"</pre>
  • 屏幕保护程序未启用 运行,但用户登录:
[ 2020 年 12 月 27 日星期日 | 25:26:21 ] 屏幕保护程序:已启用 "Fliqlo.scr"
[ 2020 年 12 月 27 日星期日 | 25:26:21 ] 屏幕保护程序:运行 "Fliqlo.scr"
[ 2020 年 12 月 27 日星期日 | 25:26:21 ] 工作站:记录 "LAME_SLUG"</pre>
  • 已启用屏幕保护程序但未启用 运行,工作站已锁定:
[ 2020 年 12 月 27 日星期日 | 25:15:28 ] 屏幕保护程序:已启用 "Fliqlo.scr"
[ 2020 年 12 月 27 日星期日 | 25:15:28 ] 屏幕保护程序:已停止 "Fliqlo.scr"
[ 2020 年 12 月 27 日星期日 | 25:15:28]工作站:锁定"LAME_SLUG"</pre>
  • 屏幕保护程序已禁用 <strike><b><i>未 运行</b></i></strike>,但用户登录:
[ 2020 年 12 月 27 日星期日 | 22:51:46 ] 屏幕保护程序:禁用“- - - - -”
[ 2020 年 12 月 27 日星期日 | 22:51:46 ] 工作站:记录 "LAME_SLUG"</pre>
  • 屏幕保护程序已禁用 <strike><b><i>未 运行</b></i></strike>,但工作站已锁定:
[ 2020 年 12 月 27 日星期日 | 22:44:11 ] 屏幕保护程序:禁用“- - - - -”
[ 2020 年 12 月 27 日星期日 | 22:44:11 ] 工作站:锁定 "LAME_SLUG"</pre>

  • 限制为 10 次循环,10 次 intervals/timeout,每次 10 秒
@echo 关闭

set/a“_c+=0”
推送“%__AppDir__%”
标题 <nul & 标题 ..\%~nx0
setlocal 启用延迟扩展
设置“_Reg_Key=HKCU\Control Panel\Desktop”

:环形
对于 /f ^skip^=2tokens^=2* %%i in (
';2^>^&1 reg.exe 查询 "!_Reg_Key!" /v SCRNSAVE.EXE
')do if /i "%%~xj" == ".scr" (set "_scr_svr=%%~nxj") else (
     回声/ [!日期! ^| !时间:~0,8! ] 屏幕保护程序:禁用“- - - - -!”
     rem./ 禁用 ScreenSaver 不需要任何状态 && 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 && (
      回声/ [!日期! ^| !时间:~0,8! ] 屏幕保护程序:运行“!_scr_svr!”
    ) || (
      回声/ [!日期! ^| !时间:~0,8! ] 屏幕保护程序:启用“!_scr_svr!”
      回声/ [!日期! ^| !时间:~0,8! ] 屏幕保护程序:已停止“!_scr_svr!”)
    )

:下一个
2>nul tasklist.exe/svc /fo list|find.exe/i "LogonUI.exe" >nul && (
         回声/ [!日期! ^| !时间:~0,8! ] 工作站:锁定“!ComputerName!”
    ) ||回声/ [!日期! ^| !时间:~0,8! ] 工作站:记录“!ComputerName!”

如果!_c! 9 (
      set /a "_c+=1" && set "_scr_svr=" && >nul timeout/t 10 & goto:Loop
    ) else popd && endlocal && goto:eof</pre>