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)
下面是一个更全面的解决方案,它是从@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.")
3条答案
按热度按时间oknwwptz1#
我在这里发现了一个提示,其中提到Computer\HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\CapabilityManager\ConsentStore\webcam\NonPackaged下的注册表项在使用网络摄像头时会更改。
这里有一些键可以跟踪应用程序使用网络摄像头的时间戳。当网络摄像头正在使用时,它会显示“LastUsedTimeStop”为0,因此要判断网络摄像头是否正在使用,我们可以简单地检查是否有任何应用程序具有LastUsedTimeStop==0。
下面是一个快速的Python类,用于轮询注册表中的网络摄像头使用情况:https://gist.github.com/cobryan05/8e191ae63976224a0129a8c8f376adc6
示例用法:
字符串
vh0rcniy2#
很好的问题,但我担心没有这样的API来返回每秒的摄像头状态,经过研究,我发现了类似的情况here,我们的成员提供了一个样本的方法来检测摄像头状态从
FileLoadException
,我认为这是唯一的方法来检查摄像头状态目前。qyzbxkaa3#
下面是一个更全面的解决方案,它是从@Chris O 'Bryan为未来读者提供的解决方案中扩展出来的,它考虑到了Windows相机应用程序等“现代”应用程序:
字符串