Подтвердить что ты не робот

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

Привет

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

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

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

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

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

Благодарим вас за то, что вы читаете время и свои возможности.

Edit: лучшим решением будет наложение, подобное тому, что описано в Steam/Xfire/Dolby Axon.

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

RenderOptions.ProcessRenderMode = RenderMode.SoftwareOnly