В Windows 10 приложения, которым требуется доступ к веб-камере, общаются с frame server
который является службой, которая работает под svchost
,
Я отфильтровываю поток веб-камеры и идентификатор процесса, который я получаю, svchost
, Я хочу определить фактический процесс, который использует веб-камеру.
Есть ли определенный способ программно определить, какое именно приложение использует веб-камеру?
Я изучил перечисление дескрипторов процессов (приходится иметь дело с NtQueryObject()
повесить), но я ищу лучшее решение.
Я сомневаюсь, что вы можете идентифицировать приложения, захватывающие видео с использованием сервера кадров (ну, на самом деле то же самое относится и к тем приложениям, которые не используют сервер кадров в текущих или более старых версиях Windows).
Microsoft добавила сервер кадров для вставки прокси между приложениями захвата видео и фактическими драйверами, реализующими такой захват. Несмотря на то, что заявленное намерение состоит в том, чтобы делить устройство с видеокамерой между приложениями, я не думаю, что оно работает, а фрейм-сервер вообще почти не задокументирован. Мое личное понимание состоит в том, что Microsoft нужно было подключиться удобным способом, чтобы разрешить доступ к видеокамерам для их технологии Windows Hello, и таким образом они использовали медиа-конвейер. Никаких дальнейших шагов не было сделано, чтобы предложить какие-либо новые опции для пользовательских приложений.
Минималистичные настольные приложения для захвата видео, пытающиеся поделиться веб-камерой, по-прежнему получают сообщение о том, что общий доступ невозможен для приложений общего назначения (я полагаю, что Microsoft, как Hello, вероятно, имеет недокументированный бэкдор на сервере кадров для общего доступа к камерам или альтернативный общий доступ включен для определенный класс клиентов, например, использующий API-интерфейс Capture Engine или аналогичный):
То есть, нет API для перечисления клиентов фрейм-сервера, и в целом приложение даже не знает, общаются ли они с реальным драйвером или прокси-сервером фрейма.
Я думаю, что попытки получить связанную информацию косвенно, например, путем проверки того, какие приложения используют модули, связанные с видео, не являются надежными и еще более запутанными в случае нескольких устройств захвата видео, в том числе виртуальных.
Насколько я знаю, не существует существующих API, которые могли бы помочь вам напрямую. Вы можете использовать Process Explorer, чтобы получить значение дескриптора веб-камеры, а затем использовать как EnumProcessModulesEx перечислить все открытые дескрипторы процесса и проверить, какое приложение использует эту веб-камеру.
Вот пример поиска открытого файла, вы можете обратиться к нему.
https://www.codeproject.com/Articles/18975/Listing-Used-Files
С уважением,
барон