Я хотел бы добавить это в качестве ответа, потому что в комментариях проводится множество обсуждений, которые перемещены в чат , поэтому я хотел бы обобщить его, чтобы будущие зрители получили представление о обсуждение и решение, которое я закончил.
Сначала я хотел бы прояснить, как работает VLC "DirectX (DirectDraw) видео выход"? Этот конкретный режим вывода VLC использует DirectDraw для создания аппаратного оверлея, и на нем воспроизводится видео. Во время захвата экрана (не с мобильной или внешней камеры) большая часть механизма захвата захватывает экран, запрашивая GDI для экранов, но аппаратные оверлеи накладываются непосредственно на GPU, и GDI не может получить доступ к GPU. Это как GDI-> CPU + RAM, DirectX-> GPU + VRAM, поэтому при захвате экрана VLC воспроизводящая видео часть отображается черным. Для получения дополнительной информации https://stackoverflow.com/a/21535254/1629242
Но как РоманР. упомянутое в чате "использование наложения, предназначенного для видео, НЕ поможет скрыть пользовательский интерфейс приложения".
Я также подтверждаю то же самое, как я упоминал в обновлении, я создал проект vc ++, который создает аппаратное наложение с использованием D3D9, если я воспроизводю видео на нем, то в записи экрана отображается черная область, но я не нашел способа сделать это наложение прозрачное, чтобы его можно было поместить в мое приложение или поместить содержимое приложения на наложение, чтобы при записи экрана содержимое приложения не было видно.
Риддел выдвинул новую идею о том, «как работают антивирусы и проходит через все процессы и проверяет хэш-инструменты для общих средств совместного использования экрана», но я лично считаю, что это не будет универсальным решением, так как я должен вести список таких приложений. и это хеш, также, если какие-либо новые приложения найдены, обновите этот список. Кроме того, любой может редактировать байты, чтобы разбить хэши, чтобы сделать это ложным.
Решение, которое я принял:
Windows API предоставляет функцию, которая помогает отображать содержимое окна только на мониторе. то есть SetWindowDisplayAffinity
, это работает как шарм !!
проблема с минимально поддерживаемой ОС:
Хотя в документе MSDN упоминается «Минимально поддерживаемый клиент :: Windows 7», но в Windows 7 он работает не для всех приложений захвата экрана. RomanR. говорится в комментарии: «Это будет работать правильно, начиная с Windows 8 (и, возможно, также с обновлением платформы для Windows 7). На чистой Windows 7 вы получаете бесплатный общий доступ к рабочему столу и не можете защитить свой контент».
Так что в настоящее время я закончил с SetWindowDisplayAffinity
Я реализовал это как:
private const uint WDA_NONE = 0x0;
private const uint WDA_MONITOR = 0x1;
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern bool SetWindowDisplayAffinity(IntPtr hWnd, uint dwAffinity);
public static bool SetDRM(Form winForm, bool Protect)
{
bool result = false;
if (winForm != null)
{
if (Protect)
result = SetWindowDisplayAffinity(winForm.Handle, WDA_MONITOR);
else
result = SetWindowDisplayAffinity(winForm.Handle, WDA_NONE);
}
return result;
}