网络摄像头打开时收到音频通知

Ser*_*scu 5 webcam windows-10

我有一台 Windows 10 家庭笔记本电脑,出于隐私原因,我想知道我的网络摄像头何时被激活。我知道当网络摄像头激活时,有一个 LED 灯会打开 + 我已启用 OSD 消息,但我想要一个声音通知(因为 LED 和 OSD 都是静音的)。

有什么方法可以实现这一点吗?我什至愿意在 VBScript 中编写一些脚本,但我不知道如何挂钩网络摄像头激活事件。

Ser*_*scu 2

两年后,我自己找到了解决方案。我注意到 Windows 10 通过隐私 --> 应用程序权限菜单跟踪相机状态:

Windows 设置屏幕截图

经过一番谷歌搜索后,我发现这些数据存储在注册表中: 注册表截图

每个键前缀代表一个应用程序(“桌面应用程序”,即非 Microsoft 商店应用程序,位于“NonPackaging”键前缀下方)。每个应用程序有 3 个子项:

  • 值:如果允许使用相机,
  • LastUsedTimeStart:应用程序上次启动相机访问的时间,
  • LastUsedTimeStop:应用程序上次停止相机访问的时间。

因此,如果我们希望在任何应用程序每次发生与相机相关的事情时收到通知(即授予/撤销权限、访问开始/停止),那么我们可以使用 Windows 管理界面来获取整个注册表的更改子树:

#Requires -version 2.0

$voice = New-Object -ComObject Sapi.spvoice
$voice.rate = 0
$voice.volume = 100

$user = [System.Security.Principal.WindowsIdentity]::GetCurrent().User.Value
Register-WmiEvent -Query "SELECT * FROM RegistryTreeChangeEvent WHERE Hive = 'HKEY_USERS' AND RootPath = '$user\\Software\\Microsoft\\Windows\\CurrentVersion\\CapabilityAccessManager\\ConsentStore\\webcam'"  -SourceIdentifier WebKeyChanged
while($true) {
    Wait-Event -SourceIdentifier WebKeyChanged
    Remove-Event -SourceIdentifier WebKeyChanged
    
    $voice.speak("Webcam!")
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,这也会在相机停止时触发,因此可能会有点吵。基于/sf/answers/10215411/,我们无法真正轻松地缩小范围 - 因此,如果有人想使用这种方法,您可能需要对音频进行去抖或添加更复杂的注册表跟踪(例如,在每个事件上导出内存中的子树+比较更改的内容以查看是否值得触发音频通知)。

好处是这也适用于新应用程序(即注册表中的全新密钥)。

就我而言,我主要对特定应用程序和“开始访问”事件感兴趣。对于这个狭窄的用例,以下 WQL 查询缩小了范围:

SELECT * FROM RegistryValueChangeEvent WHERE Hive = 'HKEY_USERS' AND KeyPath = '$user\\Software\\Microsoft\\Windows\\CurrentVersion\\CapabilityAccessManager\\ConsentStore\\webcam\\NonPackaged\\C:#Program Files (x86)#SomeProgramName#SomeProgram.exe' AND ValueName='LastUsedTimeStart'
Run Code Online (Sandbox Code Playgroud)

请注意,对于此“目标”脚本,您关心的应用程序必须至少请求一次相机访问权限,然后才能成功运行此脚本(否则查询将失败,因为注册表项不存在)。

为了让脚本始终运行,我遵循了这个问题的答案:/sf/ask/1440268021/