WPF - Прозрачность - Потоковое содержимое рабочего стола - PullRequest
16 голосов
/ 07 декабря 2010

Привет

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

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

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

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

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

Спасибо за то, что уделили нам время и поделились своими мыслями.

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

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

Ответы [ 4 ]

1 голос
/ 10 апреля 2012

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

1 голос
/ 13 января 2011

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

Создайте 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 . Не уверен, что это работает, но вы можете использовать этот вызов (см. Мой код выше в окне поиска), чтобы установить цвет прозрачности.

0 голосов
/ 29 декабря 2010

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

RenderOptions.ProcessRenderMode = RenderMode.SoftwareOnly

0 голосов
/ 08 декабря 2010

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

...