我正在尝试自动化男人窝周围的灯光,理想情况下,我希望只要计算机屏幕打开,灯就会亮,而当屏幕保护程序启动时,灯就会熄灭,而无需使用任何额外的常驻软件。
到目前为止,我设法捕捉事件 4802(屏幕保护程序启动)和 4803(屏幕保护程序停止),并使用任务计划程序和 curl 脚本向处理灯光的机器发送 http 请求,并且它在一定程度上起作用。
问题是,每当机器进入低功耗状态时,屏幕保护程序就会被终止并记录 4803,我无法区分屏幕保护程序是被用户输入终止还是被进入低功耗状态的 Windows 终止。
基本上我需要捕捉屏幕关闭和打开时发生的一些事件。有什么可以让我(在通用 win7 安装中)完成这项任务的吗?
谢谢。
编辑:
我向已经回答过这个问题的人道歉,我的问题表述得不够清楚。有问题的机器实际上并没有进入睡眠状态,因此事件日志中没有生成事件 42(内核电源)或事件 1(电源故障排除程序),机器只进入某种低功耗状态,消耗约 53W,而不是通常的 180W,虽然我可以用它来跟踪这台特定机器的电源状态,但我无法对房间中的其他 3 台计算机使用相同的检测方法,因为它们没有连接所需的硬件(UPS)。
我正在寻找的是,由于 Windows 电源管理,计算机的显示器通过 Windows(而不是通过各自的电源按钮)关闭并重新打开时发生的事件。基本上,任何可以让我同步洞穴中的灯光和显示器状态并允许任务调度程序启动操纵灯光的脚本的东西。
答案1
希望您现在已经找到了此任务的另一个解决方案,无论如何,这是一个有趣的问题,我想尝试一下,也许其他人会受益。我的解决方案不是尝试监视屏幕保护程序状态,而是使用任务计划程序中的“空闲”监视选项。虽然这是在 Windows 10 上构建的,但我相信所使用的功能在 W7 中应该相同。
概述
- “空闲”Windows 计划任务触发“空闲”脚本,并使用条件选项卡上的内置空闲选项等待计算机空闲后再启动,然后在计算机不再空闲时停止。
- “Idle”脚本触发“Watcher”脚本,采取您选择的操作(调暗灯光),然后继续运行等待explorer.exe退出,这将(应该)永远不会发生。
- “Watcher”脚本找到“Idle”脚本的进程并等待其退出,然后完成其操作(重新打开灯)。
事件的基本路径
- “空闲”任务尝试每 1 分钟运行一次,但仅当 PC 空闲了您选择的时间量时才会运行。
- “空闲”任务运行“空闲”脚本。该脚本触发“Watcher”脚本,触发您选择的操作(调暗灯光),然后使用“wait-process”cmdlet 等待 explorer.exe 退出,如果 Windows 稳定,这种情况永远不会发生,因此只要 PC 处于空闲状态,它就会继续运行。
- “Watcher”脚本启动并监视“Idle”脚本的进程是否退出。
- 用户输入导致PC退出空闲状态,杀死“Idle”任务,从而杀死“Idle”脚本的powershell.exe进程。
- “Watcher”脚本看到“Idle”脚本进程退出,将灯重新打开然后退出。
设置
- 创建包含两个脚本的脚本文件夹。
将 powershell 可执行文件复制到新文件夹中:
"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" >>>> C:\scripts\dimlights\
创建“Idle.ps1”并粘贴脚本。在脚本的第一行,指定包含脚本的文件夹和 powershell.exe 的副本:
$myScriptDir = "C:\scripts\dimlights\" #============= Variables ================== $logfile = join-path $myScriptDir log.txt $nid = (Get-Process explorer).Id $mydate = Get-date #============= Code ================== start-process powershell.exe -argumentlist "-NonInteractive –ExecutionPolicy Bypass -file $myScriptDir\watcher.ps1" echo "$mydate - PID: $nid - Idle start action" | out-file -Append $logfile #----------------Insert chosen action code here---------------- Wait-Process $nid
$mydate = Get-date echo “$mydate - PID: $nid - Idle 中的最后一行,不应该被到达。” | out-file -Append $logfile
在同一文件夹中创建“Watcher.ps1”并粘贴脚本,再次指定文件夹:
$myScriptDir = "C:\scripts\dimlights\" #============= Variables ================== $myPSPath = join-path $myScriptDir powershell.exe $logfile = join-path $myScriptDir log.txt $nid = (Get-Process powershell | Where-Object {$_.path -eq $myPSPath}).id $mydate = Get-date #============= Code ================== echo "$mydate - PID: $nid - Watcher started" | out-file -Append $logfile if ($nid -ne $null){ Wait-Process -id $nid $mydate = Get-date echo "$mydate - PID: $nid - Watcher end action" | out-file -Append $logfile #---------------- Insert chosen wake up action code here ---------------- } else { echo "$mydate - PID: $nid - No such process, exiting watcher." | out-file -Append $logfile
}
以管理员身份打开任务计划程序并创建“空闲”任务;
- 在常规选项卡上,选择以“更改用户或组”的身份运行任务。
- 在“选择用户或组”窗口中,单击高级按钮,然后单击“立即查找”。
- 向下滚动找到“SYSTEM”帐户,单击一次以突出显示,然后单击“确定”。
- 再次单击“确定”。
- 切换到触发器选项卡并创建几分钟后的一次性触发器。
- 在高级设置下,选中“每隔:重复任务”框,然后在框中输入“1 分钟”,并将“持续时间”更改为无限期。
- 切换到操作选项卡并添加新操作;
- “程序/脚本”框应包含您之前复制到脚本文件夹的 powershell.exe 的路径。
添加以下参数,将文件路径替换为您自己的路径:
-ExecutionPolicy 绕过 -file "C:\scripts\idle.ps1"
转到条件选项卡并选中仅在空闲时启动的复选框,将空闲时间设置为您选择的超时时间。
- 选中空闲部分下的另外两个框“如果计算机不再空闲则停止”和“如果空闲状态恢复则重新启动”。
- 单击“确定”保存并关闭计划任务。
希望有人觉得这有用!
蒂姆