我对 Windows 脚本非常不熟悉(我有 Linux 背景),但我还是尝试创建 Windows 版本的 udev 规则。我拼凑了各种搜索中的片段,以检测我的键盘/鼠标何时被拔出(使用 USB 开关)并关闭屏幕。当我自己运行 powershell 脚本时,它运行良好,但我尚未使用任务计划程序使其工作。我在下面附上了简单的脚本。
C:\Scripts\keyboard_listener.ps1
$query = "SELECT * FROM __InstanceOperationEvent WITHIN 5 WHERE TargetInstance ISA 'Win32_PnPEntity'"
Register-WmiEvent -Query $query -SourceIdentifier RemovableDiskDetection -Action {
$class = $eventArgs.NewEvent.__CLASS
$device = $eventArgs.NewEvent.TargetInstance.Caption
switch($class)
{
__InstanceCreationEvent {
if ($device -eq "Logitech Gaming HID Device") {
Write-Host "Inserted, device id: $device"
}
}
__InstanceDeletionEvent {
if ($device -eq "Logitech Gaming HID Device") {
Write-Host "Removed, device id: $device"
(Add-Type '[DllImport("user32.dll")]public static extern int SendMessage(int hWnd, int hMsg, int wParam, int lParam);' -Name a -Pas)::SendMessage(-1,0x0112,0xF170,2)
}
}
}
}
我很确定我已经正确创建了任务。操作是powershell -noexit -file C:\Scripts\keyboard_listener.ps1
。我甚至记录了计划任务以确保它正在运行并将 stdout/stderr 输出到日志。当我查看日志时,我可以按预期看到“已插入/已移除”调试消息,但监视器不会关闭。正如我提到的,当我自己运行此命令时,它会按预期工作。我遗漏了什么?
我尝试从 .cmd 文件运行 powershell 脚本,结果相同。我弄乱了 SetExecutionPolicy 标志。不过,我认为这两者都不重要,因为我能够在日志文件中获取调试输出。我相信这意味着 powershell 脚本正在执行,并且断开连接/重新连接事件正在触发。唯一没有发生的事情是我的显示器关闭了。
补充:我还没有深入研究过这个问题,但是当键盘重新连接时,我可以重新打开屏幕吗?我自己还没有解析关闭显示器的命令,因此无法确切了解它的工作原理,但如果能修改它以重新打开屏幕就好了。不过,这不是我的首要任务。