如何让 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>
如何编写批处理程序来确定屏幕保护程序是否处于 运行 或用户是否进入睡眠状态或锁定计算机?
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>