WPF — прозрачность — потоковое содержимое рабочего стола

Привет

Я занимаюсь созданием табло для игры (Starcraft II). Это табло создается как приложение WPF с кодом программной части C#. У меня уже есть версия, которая работает на 90% в WinForms, но мне не хватало поддержки, чтобы легко сделать ее намного лучше, которая доступна в WPF.

Суть этого приложения будет заключаться в том, чтобы сформировать своего рода наложение поверх запущенной игры. Эта игра находится в полноэкранном режиме (оконный режим), поэтому в WinForms я закодировал ее так, чтобы она всегда была сверху. Так и будет, и это не проблема.

Поскольку основной внешний вид приложения в WPF основан на изображении с прозрачным фоном, я установил для большинства значений фона значение «Прозрачный». Однако, когда я делаю это, все приложение не регистрируется потоковым программным обеспечением. Например, он просто показывает мой рабочий стол или игру, в которую я играю, но не мое приложение, хотя оно там ЕСТЬ. Я вижу это своими глазами, но зрители на стриме не могут.

Есть ли у кого-нибудь опыт в этом вопросе, потому что это действительно делает мне голову. Все мое приложение будет бесполезным, если его не видно в потоках. Если мне придется сделать фон цветным, а не прозрачным, пользовательский интерфейс также будет полностью разрушен с точки зрения внешнего вида.

Я в основном пытаюсь сделать наложение игры на С# и WPF. Я читал, что вы можете сделать это по-разному, но я практически не знаю C++ и ничего не знаю о DirectX.

Спасибо за ваше время чтения и ваши возможные идеи.

Редактировать: Лучшим решением будет наложение, подобное наложению Steam/Xfire/Dolby Axon.

Редактировать 2: мне не повезло со всеми предложениями, поэтому я в основном сделал прозрачные биты моего изображения непрозрачными и позволил пользователю решить, какой из них использовать, в зависимости от того, какое потоковое программное обеспечение они будут использовать.


person Community    schedule 07.12.2010    source источник
comment
Возможно, вам повезет больше, разместив сообщение на gamedev.stackexchange.com.   -  person Rachel    schedule 07.12.2010
comment
Спасибо, попробую!   -  person    schedule 07.12.2010
comment
Какое программное обеспечение для захвата вы используете для создания потока? FRAPS, Camtasia и т.д.?   -  person Philip Rieck    schedule 07.12.2010
comment
Что ж, это XSplit Broadcaster, который в настоящее время находится в бета-версии, но позволяет вам транслировать действительно хорошее качество (HD).   -  person    schedule 07.12.2010
comment
Хотя это и не ответ, но на заметку о дополнительных исследованиях успехов в этом подходе и отрасли ... Я настоятельно рекомендую изучить, как Steam добавляет свой контент Shift + Tab в игры. Он показывает текущее время, имеет веб-браузер, список друзей и взаимодействие, а также весьма полезен и ненавязчив, когда не используется.   -  person zanlok    schedule 10.12.2010
comment
Steam использует хуки, чтобы получить свой материал DirectX в программе или что-то в этом роде. Я мало знаю ни о DirectX, ни о C++, поэтому у меня нет ни малейшего понятия, с чего начать, но спасибо за предложение!   -  person    schedule 10.12.2010
comment
Явно установите Background=Transparent в MainWindow с помощью AllowsTransparency=True. Я читал, что вы установили фон, но не знаю, где.   -  person Eugene Cheverda    schedule 26.12.2010
comment
@Eugene Я сделал это, но тогда это не отображается в программном обеспечении для потоковой передачи, хе-хе. Сейчас я сделал две версии, одну прозрачную и одну непрозрачную.   -  person    schedule 26.12.2010


Ответы (4)


У меня была такая же проблема с прозрачностью в WPF. Когда вы устанавливаете прозрачность на ноль, ему нечего подбирать. Установите его на минимальное значение, тогда потоковое программное обеспечение сможет его подобрать.

person Habib Ahmed Bhutto    schedule 10.04.2012

Просто идея, но что, если вы сделаете его почти прозрачным (т.е. альфа = 0,01 или около того)? Тогда у него должно быть достаточно «вещества», чтобы быть подхваченным потоком, но при этом он должен быть достаточно невидимым, чтобы не мешать обзору.

person TToni    schedule 08.12.2010
comment
Проблема в том, что когда я устанавливаю AllowsTransparency=True, это не отображается в программном обеспечении для потоковой передачи. Если я установлю для него значение false, вокруг изображения из окна появится уродливая рамка, что не является идеей =[. Если я изменю непрозрачность окна, проблема в том, что все в этом окне станет едва видимым. - person ; 08.12.2010
comment
Извините, тогда у меня тоже нет идей. - person TToni; 08.12.2010
comment
Я думаю, у вас есть ответ там ... держите непрозрачность окна на низком уровне, разрешите прозрачность на false ... но вы говорите, что все на панели едва видно ... это графическая проблема, вы должны выбрать темную панель bgcolor, например, иметь яркий текст поверх него - или иметь еще несколько панелей с разными цветами в качестве дочерних элементов управления с более низкой непрозрачностью снова.. так что дочерние элементы управления будут иметь свою собственную непрозрачность и непрозрачность родительской панели вместе, чтобы придать приятное ощущение области, в то время как текст или партитура на дочерних панелях выглядят просто четкими. Что вы думаете ? что помогает ? - person ; 10.12.2010
comment
Непрозрачность не работает, когда для параметра AllowsTransparency установлено значение false: s. - person ; 18.12.2010
comment
Прозрачность обеспечивается специальным аппаратным обеспечением на видеокарте, как и наложение видео/игр. Их наложение было достигнуто до Windows Vista (не уверен насчет Vista и 7), заключалось в том, что приложение представляло определенный цвет, который видеокарта заменяла изображением. Вы можете проверить это, сделав скриншот игры и удерживая изображение над ним. Если вы можете видеть насквозь, то именно так выглядит игра. :) - person Tedd Hansen; 13.01.2011

Одна из возможностей заключается в том, что альфа-смешение выполняется полностью на графическом процессоре, что не позволяет программному обеспечению для потоковой передачи его найти. Таким образом, вы можете попробовать принудительно отобразить программное обеспечение в своем приложении WPF. Вы можете сделать это, установив:

RenderOptions.ProcessRenderMode = RenderMode.SoftwareOnly

person Joe Strommen    schedule 28.12.2010
comment
Боюсь, это тоже не работает :(. Как только мои окна переключаются на основную тему (программное обеспечение для потоковой передачи делает это автоматически), она исчезает, в противном случае она отображается в потоке. - person ; 29.12.2010

Поскольку вы еще не получили никакого ответа, я решил предложить немного другой подход.

Создайте WinForm, для которого вы установили MDIParent. Затем вы отправляете Win32API-команду, чтобы перенести игру в ваше приложение в виде дочернего окна, убрать границы, развернуть его.

IntPtr Parent = hWnd of your main form.
IntPtr hWnd = Win32.User.FindWindow(null, "TheGame");
Win32.User.SetParent(hWnd, Parent);
// Get current window style of child form
int style = Win32.User.GetWindowLong(hWnd, Win32.User.GWL_STYLE);
// Take current window style and remove WS_CAPTION and WS_BORDER from it
Win32.User.SetWindowLong(hWnd, Win32.User.GWL_STYLE, (style & ~Win32.User.WS_CAPTION & ~Win32.User.WS_BORDER));
// Maximize within parent
Win32.User.ShowWindow(hWnd, Win32.User.SW_SHOWMAXIMIZED);

Примечание. Класс Win32.User — это всего лишь ванильная оболочка для соответствующих команд взаимодействия Win32.

Теперь вы должны быть в состоянии рисовать поверх этого окна либо с помощью GDI+, напрямую связанного с hWnd, либо помещая что-то поверх него. Проблема, с которой вы столкнулись с прозрачностью, может потребовать от вас ручного копирования, то есть вы где-то визуализируете свой интерфейс, а затем копируете его попиксельно в целевое окно, пропуская любые прозрачные пиксели.

Я надеюсь, что это полезно или, по крайней мере, может вызвать некоторые идеи.

EDIT: Также вам может быть интересно:
http://blog.tedd.no/index.php/2010/08/16/c-image-analysis-auto-gaming-with-source/

Пример приложения позволяет изменять изображение перед его отображением. Вы просто добавляете к нему простые модули, которые получают ввод и задают вывод. Однако слишком медленно для реальных игр. :)

EDIT2: Только что наткнулся на SetLayeredWindowAttributes. Не уверен, что это работает, но вы можете использовать этот вызов (см. мой код выше при поиске окна), чтобы установить цвет прозрачности.

person Tedd Hansen    schedule 13.01.2011