如何解决如何在屏幕保护程序打开时检测窗口的批处理文件?
如何编写批处理程序以确定屏幕保护程序是否正在运行、用户是否进入睡眠状态或计算机是否锁定?
在 Ubuntu Linux 的 bash 中,我使用代码:/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
)
默认的 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
)
,
@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
和 {{ 1}}
-
Obs.1 在使用
some_name.scr == Some_Name.SCR
的任务列表中,tasklist
存在任何字符串在还包含字符串|find ".scr"
(仅限小写)的名称中,这也将列出屏幕保护程序是否正在运行。 -
Obs.2 如果 screen_saver_long_name.scr 名称(包括扩展名)中的字符长度大于 25,则带有
.str
,你永远不会过滤/找到这个文件,因为tasklist | find ".src"
(没有任何tasklist
)在输出中只有 26 个字符的长度(,以.结尾) -
Obs.:3 对于正在运行某些屏幕保护程序名称(如
/flag
)的列表进程,请使用Security Screensaver NG.scr
4. 使用循环并保持对循环过程中随时可能发生的任何更改的监控,不断查询注册表值。
可能的状态和输出:
- 屏幕保护程序已启用但未运行,但用户已登录:
tasklist /svc /fo list
- 屏幕保护程序已启用并正在运行,但工作站已锁定:
[ 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
- 限制为 10 个循环,10 个间隔/超时,每个 10 秒
[ Sun 12/27/2020 | 22:44:11 ] Screen Saver: Disable " - - - - -"
[ Sun 12/27/2020 | 22:44:11 ] Work Station: Locked "LAME_SLUG"
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。