Во-первых, причина того, что содержимое VLC не захватывается при использовании printscreen или других методов захвата экрана, заключается в том, что (по крайней мере, в более старых версиях Windows) они используют «наложение» для представления видео. Это специальная конструкция графического процессора, которая позволяет выполнять рендеринг в виртуальную «плоскость» над нормальной поверхностью экрана. Так как это обходит все остальное и идет прямо к графическому процессору, не существует простого способа его запечатлеть. ПРИМЕЧАНИЕ. В последних выпусках Windows правила немного изменились в отношении оверлеев. Приложения не могут предполагать, что оверлеи D3D9 / DDraw поддерживаются, и приложения не должны использовать их в настоящее время, поскольку система имеет гораздо лучшие способы представления контента с такой же высокой производительностью.
Direct3D 9 оверлеев
Если вы отображаете видео с помощью Direct3D 9, вы также можете использовать оверлей. См. эту страницу на MSDN для получения информации о том, как это сделать. Существует множество ограничений на использование оверлеев D3D9, и они не поддерживаются на большом количестве оборудования, поэтому я опишу некоторые другие подходы.
Этот метод не запрещает другим приложениям вводить их в ваше адресное пространство и захватывать ваши подарки. Кроме того, поскольку он не поддерживается на некоторых аппаратных средствах, а некоторые API-интерфейсы захвата фактически отключают наложения, он не обеспечивает очень надежных гарантий защиты.
Защита содержимого на основе графического процессора
Если у вас есть много времени, чтобы узнать о защите контента с помощью графического процессора, и вы знаете, что будете отображать нестандартный формат видео с защитой DRM, вы можете прокрутить свой собственный путь к защищенному носителю, используя защиту контента с помощью графического процессора. Я не эксперт в этой области, и таких мало. Я не рекомендовал бы это, но я хотел указать на это. На этой странице MSDN рассказывается о том, как это реализовано в Direct3D 9, а на на другой странице рассказывается о том, как это реализовано с использованием Direct3D 11.
Этот метод обеспечивает сильную гарантию того, что контент не был захвачен, поскольку обмен ключами происходит почти полностью через аппаратное обеспечение (например, HDCP).
Media Foundation Protected Media Path (PMP)
Если вы просматриваете видео в хорошо поддерживаемом медиаформате на основе DRM, вы можете использовать Media Foundation Protected Media Path, который использует защиту контента на основе графического процессора, описанную ранее. Он также заключает в себе большую часть функциональности в отдельном защищенном процессе, который другие приложения не могут перехватить или иным образом взаимодействовать. Если кто-то попытается установить подписанный тестовым драйвером или иным образом внедрить двоичный файл, не подписанный кодом доверенным корневым центром, Windows не разрешит дешифрование контента, и ваш контент останется в безопасности. Этот метод обеспечивает strong гарантии того, что контент не был захвачен. Используется Netflix для Windows, проигрывателей Blueray и других.
DXGI Флаги со сменной цепью
Предполагая, что вы представляете контент с использованием Direct3D 10.x / 11.x (и, надеюсь, теперь вы, в отличие от D3D 9, в 2014 году), вы можете использовать несколько флагов в цепочке обмена, чтобы заблокировать вашу содержание.
Вы можете передать DXGI_SWAP_CHAIN_FLAG_RESTRICTED_CONTENT
в флагах цепочки подкачки, чтобы не создать ее, если система не имеет HDCP или HDCP-подобной защиты выходов. Это, вероятно, не нужно для ваших целей, но это хорошо, если вы беспокоитесь о людях, захвативших HDMI или аналоговый выход.
Флаг, который вам определенно нужен, называется DXGI_SWAP_CHAIN_FLAG_DISPLAY_ONLY
. Это препятствует тому, чтобы все API захвата экрана когда-либо видели вашу цепочку обмена. Для них это будет просто черный прямоугольник.
См. на этой странице для всех флагов цепочки обмена DXGI.
Этот метод не дает надежных гарантий, которые обеспечивает защита контента на основе графического процессора, но если вы достаточно уверены, что другие приложения не делают сумасшедших вещей, таких как внедрение себя в ваше адресное пространство и перехват ваших текущих вызовов, вы можете будьте уверены, что это не позволит никому другому видеть ваш контент (кроме монитора, конечно).
Полная защита окон
Иногда вам может потребоваться защитить не только контент, представленный DXGI. В этом случае вы можете фактически использовать аналогичный механизм, чтобы просто защитить все окно от захвата различными методами захвата экрана. Это API под названием SetWindowDisplayAffinity
. По силе и функциональности он эквивалентен передаче флага DXGI_SWAP_CHAIN_FLAG_DISPLAY_ONLY
для цепочки подкачки, но также защищает контент, представленный с помощью GDI, более старых технологий DirectX и т. Д. Передайте флаг WDA_MONITOR
, чтобы включить защиту для данного HWND или передать WDA_NONE
для отключения защиты.
Для полного раскрытия информации я работаю в Microsoft в команде, которая занимается логикой отображения, включая некоторые формы захвата экрана и защиты контента.