捕捉屏幕打开/关闭并在发生时运行脚本或程序

Din*_*ngo 5 windows-7 sleep events task-scheduler

我正在尝试使人洞周围的灯光自动化,理想情况下,只要计算机屏幕打开,并且屏幕保护程序启动时灯光熄灭,我就希望灯光一直亮着,而不使用任何额外的驻留软件。

到目前为止,我设法捕获了事件 4802(屏幕保护程序启动)和 4803(屏幕保护程序停止)并使用任务调度程序和 curl 脚本向处理灯的机器发出 http 请求,并且在一定程度上可以正常工作。

问题是,每当机器进入低功耗状态时,屏幕保护程序都会被杀死并记录 4803,我无法区分屏幕保护程序被用户输入杀死还是窗口进入低功率状态。

基本上我需要捕捉屏幕关闭和打开时发生的一些事件。有什么东西(在通用的 win7 安装中)我可以完成任务吗?

谢谢。

编辑:

我向已经回答过这个问题的人道歉,我的问题表述得不够清楚。有问题的机器实际上并未进入睡眠状态,因此事件日志中没有生成事件 42(内核电源)或事件 1(电源故障排除程序),机器仅进入某种低功耗状态,消耗大约53W,而不是通常的 180W,虽然我可以用它来跟踪这台特定机器的电源状态,但我无法对房间里的其他 3 台计算机使用相同的检测方法,因为它们没有所需的硬件 (UPS) 连接到它们。

我正在寻找的是,由于 Windows 电源管理,当计算机的显示器通过 Windows(而不是通过它们各自的电源按钮)关闭和重新打开时发生的事件。基本上任何可以让我将洞穴中的灯光与监视器的状态同步并允许任务调度程序触发操纵灯光的脚本的任何东西。

小智 3

希望您现在已经找到了此任务的另一个解决方案,无论哪种方式,这都是我想尝试解决的一个有趣的问题,也许其他人会受益。\n我的解决方案不是尝试监视屏幕保护程序状态,而是使用“ \n虽然这是在 Windows 10 上构建的,但我相信使用的功能在 W7 中应该是相同的。

\n\n

概述

\n\n
    \n
  • “空闲”Windows 计划任务触发“空闲”脚本,并使用条件选项卡上的内置空闲选项等待计算机空闲才启动,然后在计算机停止空闲时停止。
  • \n
  • “空闲”脚本触发“观察者”脚本,执行您选择的操作(昏暗的灯光),然后继续运行,等待 explorer.exe 退出,这种情况(不应该)永远不会发生。
  • \n
  • “Watcher”脚本找到“Idle”脚本的进程,并等待其退出,然后再完成其操作(重新打开灯)。
  • \n
\n\n

事件的基本路径

\n\n
    \n
  1. “空闲”任务尝试每 1 分钟运行一次,但仅当 PC 在您选择的时间内处于空闲状态时才会运行。
  2. \n
  3. “空闲”任务运行“空闲”脚本。该脚本触发“Watcher”脚本,触发您选择的操作(昏暗的灯光),然后使用“wait-process”cmdlet 等待 explorer.exe 退出,假设 Windows 稳定并因此继续运行,这种情况永远不会发生只要 PC 空闲。
  4. \n
  5. “Watcher”脚本启动并监视“Idle”脚本的进程退出。
  6. \n
  7. 用户输入导致PC退出空闲状态,杀死“Idle”任务,从而杀死“Idle”脚本的powershell.exe进程。
  8. \n
  9. “Watcher”脚本看到“Idle”脚本进程退出,将灯重新打开,然后退出。
  10. \n
\n\n

设置

\n\n
    \n
  1. 创建包含这两个脚本的脚本文件夹。
  2. \n
  3. 将 powershell 可执行文件复制到新文件夹中:

    \n\n
    "C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe" >>>> C:\\scripts\\dimlights\\\n
    Run Code Online (Sandbox Code Playgroud)
  4. \n
  5. 创建“Idle.ps1”并粘贴到脚本中。在脚本的第一行,指定包含脚本和 powershell.exe 副本的文件夹:

    \n\n
    $myScriptDir = "C:\\scripts\\dimlights\\"\n#============= Variables ==================\n$logfile = join-path $myScriptDir log.txt\n$nid = (Get-Process explorer).Id\n$mydate = Get-date\n\n#============= Code ==================\nstart-process powershell.exe -argumentlist "-NonInteractive \xe2\x80\x93ExecutionPolicy Bypass -file $myScriptDir\\watcher.ps1"\necho "$mydate - PID: $nid - Idle start action" | out-file -Append $logfile\n#----------------Insert chosen action code here----------------\nWait-Process $nid\n
    Run Code Online (Sandbox Code Playgroud)\n\n

    $mydate = Get-date\necho "$mydate - PID: $nid - 空闲中的最后一行,不应到达。" | 输出文件-附加$logfile

  6. \n
  7. 在同一文件夹中创建“Watcher.ps1”并粘贴到脚本中,再次指定文件夹:

    \n\n
    $myScriptDir = "C:\\scripts\\dimlights\\"\n#============= Variables ==================\n$myPSPath = join-path $myScriptDir powershell.exe\n$logfile = join-path $myScriptDir log.txt\n$nid = (Get-Process powershell | Where-Object {$_.path -eq $myPSPath}).id\n$mydate = Get-date\n\n#============= Code ==================\necho "$mydate - PID: $nid - Watcher started" | out-file -Append $logfile\nif ($nid -ne $null){\nWait-Process -id $nid\n$mydate = Get-date\necho "$mydate - PID: $nid - Watcher end action" | out-file -Append $logfile\n#---------------- Insert chosen wake up action code here ----------------\n}\nelse {\necho "$mydate - PID: $nid - No such process, exiting watcher." | out-file -Append $logfile\n
    Run Code Online (Sandbox Code Playgroud)\n\n

    }

  8. \n
  9. 以管理员身份打开任务计划程序并创建“空闲”任务;

    \n\n
      \n
    • 在常规选项卡上,选择“更改运行任务的用户或组”。
    • \n
    • 在“选择用户或组”窗口中,单击高级按钮,然后单击“立即查找”。
    • \n
    • 向下滚动找到“SYSTEM”帐户,单击一次突出显示,然后单击“确定”。
    • \n
    • 再次单击“确定”。
    • \n
    • 切换到触发器选项卡并在未来几分钟内创建一次性触发器。
    • \n
    • 在高级设置下,选中“重复任务间隔:”框,然后在框中输入“1 分钟”,并将“持续时间”更改为无限期。
    • \n
    • 切换到动作选项卡并添加新动作;
    • \n
    • “程序/脚本”框应包含您之前复制到脚本文件夹的 powershell.exe 的路径。
    • \n
    • 添加以下参数,将文件路径替换为您自己的文件路径:

      \n\n

      -ExecutionPolicy绕过-文件“C:\\scripts\\idle.ps1”

    • \n
    • 转到条件选项卡并选中仅在空闲时启动的框,将空闲时间设置为您选择的超时。

    • \n
    • 选中空闲部分下的另外两个框“如果计算机停止空闲则停止”和“如果空闲状态恢复则重新启动”。
    • \n
    • 单击“确定”保存并关闭计划任务。
    • \n
  10. \n
\n\n

希望有人觉得这很有用!

\n\n

蒂姆

\n