如何在不激活摄像头的情况下确定Windows 10上是否正在使用摄像头?

shstlldc  于 2023-11-21  发布在  Windows
关注(0)|答案(3)|浏览(233)

在Windows 10上,如何确定连接的网络摄像头当前是否处于活动状态,而无需在摄像头关闭时将其打开?
目前,我可以尝试使用相机拍照,如果失败,则假设相机正在使用中。然而,这意味着相机的活动LED将打开(因为相机正在使用中)。由于我想每隔几秒钟检查相机的状态,因此使用此方法来确定相机是否正在使用是不可行的。
我已经使用了Win32和UWP标记,并将接受使用任何API的解决方案。

oknwwptz

oknwwptz1#

我在这里发现了一个提示,其中提到Computer\HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\CapabilityManager\ConsentStore\webcam\NonPackaged下的注册表项在使用网络摄像头时会更改。
这里有一些键可以跟踪应用程序使用网络摄像头的时间戳。当网络摄像头正在使用时,它会显示“LastUsedTimeStop”为0,因此要判断网络摄像头是否正在使用,我们可以简单地检查是否有任何应用程序具有LastUsedTimeStop==0。
下面是一个快速的Python类,用于轮询注册表中的网络摄像头使用情况:https://gist.github.com/cobryan05/8e191ae63976224a0129a8c8f376adc6
示例用法:

import time
from webcamDetect import WebcamDetect
webcamDetect = WebcamDetect()
while True:
    print("Applications using webcam:")
    for app in webcamDetect.getActiveApps():
        print(app)
    print("---")
    time.sleep(1)

字符串

vh0rcniy

vh0rcniy2#

很好的问题,但我担心没有这样的API来返回每秒的摄像头状态,经过研究,我发现了类似的情况here,我们的成员提供了一个样本的方法来检测摄像头状态从FileLoadException,我认为这是唯一的方法来检查摄像头状态目前。

qyzbxkaa

qyzbxkaa3#

下面是一个更全面的解决方案,它是从@Chris O 'Bryan为未来读者提供的解决方案中扩展出来的,它考虑到了Windows相机应用程序等“现代”应用程序:

"""Webcam usage"""
import winreg

KEY = winreg.HKEY_CURRENT_USER
SUBKEY = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\CapabilityAccessManager\\ConsentStore\\webcam"
WEBCAM_TIMESTAMP_VALUE_NAME = "LastUsedTimeStop"

def get_active_camera_applications() -> list[str]:
    """Returns a list of apps that are currently using the webcam."""

    def get_subkey_timestamp(subkey) -> int | None:
        """Returns the timestamp of the subkey"""
        try:
            value, _ = winreg.QueryValueEx(subkey, WEBCAM_TIMESTAMP_VALUE_NAME)
            return value
        except OSError:
            pass
        return None

    active_apps = []
    try:
        key = winreg.OpenKey(KEY, SUBKEY)
        # Enumerate over the subkeys of the webcam key
        subkey_count, _, _ = winreg.QueryInfoKey(key)
        # Recursively open each subkey and check the "LastUsedTimeStop" value.
        # A value of 0 means the camera is currently in use.
        for idx in range(subkey_count):
            subkey_name = winreg.EnumKey(key, idx)
            subkey_name_full = f"{SUBKEY}\\{subkey_name}"
            subkey = winreg.OpenKey(KEY, subkey_name_full)
            if subkey_name == "NonPackaged":
                # Enumerate over the subkeys of the "NonPackaged" key
                subkey_count, _, _ = winreg.QueryInfoKey(subkey)
                for np_idx in range(subkey_count):
                    subkey_name_np = winreg.EnumKey(subkey, np_idx)
                    subkey_name_full_np = f"{SUBKEY}\\NonPackaged\\{subkey_name_np}"
                    subkey_np = winreg.OpenKey(KEY, subkey_name_full_np)
                    if get_subkey_timestamp(subkey_np) == 0:
                        active_apps.append(subkey_name_np)
            else:
                if get_subkey_timestamp(subkey) == 0:
                    active_apps.append(subkey_name)
            winreg.CloseKey(subkey)
        winreg.CloseKey(key)
    except OSError:
        pass
    return active_apps

active_apps = get_active_camera_applications()

if len(active_apps) > 0:
    print("Camera is in use by the following apps:")
    for app in active_apps:
        print(f"  {app}")
else:
    print("Camera is not in use.")

字符串

相关问题