在 C# 中获取网络摄像头的当前状态

Tob*_*mpe 3 c# c++ winapi directshow aforge

我试图弄清楚如何检查网络摄像头/视频捕获设备是否已被另一个应用程序使用,而无需实际激活它。

我当前的方法是使用 AForge.NET 库并使用 VideoCaptureDevice 对象的 .IsRunning 属性,如下所示:

 var videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
                
 foreach (FilterInfo videoDevice in videoDevices)
 {
    VideoCaptureDevice camera new AForge.Video.DirectShow.VideoCaptureDevice(videoDevice.MonikerString);
    Debug.Print(camera.IsRunning)
 }
Run Code Online (Sandbox Code Playgroud)

我猜想 IsRunning 属性仅适用于已开始使用该库的 VideoCaptureDevices,并且我需要对设备进行较低级别的 DirectShow 访问。

虽然在 C# 中使用 DirectShow 的方法有很多,但即使在 C++ 中使用 DirectShow,我也无法找到检查状态的方法。我需要在这里施展什么魔法吗?

谢谢

托比亚斯·廷普

Mat*_*eld 9

我不完全确定这是否对您有帮助,但我发现您的问题是因为我想编写一个自定义应用程序来控制我的忙碌灯。这在很大程度上是“在我的机器上运行”认证的 - 这并不是试图给出一般性答案。但是,我认为它可能对您有所帮助,并且可能对下一个在谷歌搜索时看到此页面的人有所帮助......

private static bool IsWebCamInUse()
{
    using (var key = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\CapabilityAccessManager\ConsentStore\webcam\NonPackaged"))
    {
        foreach (var subKeyName in key.GetSubKeyNames())
        {
            using (var subKey = key.OpenSubKey(subKeyName))
            {
                if (subKey.GetValueNames().Contains("LastUsedTimeStop"))
                {
                    var endTime = subKey.GetValue("LastUsedTimeStop") is long ? (long) subKey.GetValue("LastUsedTimeStop") : -1;
                    if (endTime <= 0)
                    {
                        return true;
                    }
                }
            }
        }
    }

    return false;
}
Run Code Online (Sandbox Code Playgroud)

  • 这正是我一直在寻找的!我正在将 Adafruit TrinketM0 设置为自定义忙灯,我想检查网络摄像头是否处于活动状态,然后将其设置为忙。我确实必须将目标平台设置为 64 位,因为密钥为空。`Properties &gt; Build &gt; Platform Target = x64` 我还必须使用 LocalMachine `Registry.LocalMachine.OpenSubKey...`。 (2认同)