2012-04-29 20 views
7

Mam aplikację WPF, która jest przeznaczona do nakładania HUDa w strumieniu na żywo. Pierwotnym pomysłem było stworzenie wtyczki dla xsplit (popularnej aplikacji do prezentowania transmisji na żywo), aby wyświetlić zawartość aplikacji WPF. Problem z tym podejściem polega na tym, że renderowanie bitmapy do interfejsu COM xsplit ma daleko zaszkodzić wydajności procesora, aby zwolnić aplikację (Sądzę, że są problemy z interfejsem COM xsplit, a także używanie RenderTargetBitmap obciążających procesor).Rendering z wewnętrznych elementów WPF do aplikacji Directx

Szukałem bezpośredniego renderowania nakładki w grze (docelowa aplikacja DirectX), ponieważ zapewnia ona wiele korzyści. Głównie omija problemy z wydajnością w xsplit, ale także otwiera aplikację na różne aplikacje do przesyłania strumieniowego i przechwytywania.


nie jestem bardzo doświadczony z DirectX, ale myślę, że to jest zarys rozwiązania

  1. inicjalizację aplikacji WPF i uchwycić urządzenia Direct3D WPF za (via this method)

  2. Znajdź i podpowiedz docelową aplikację EndScene aplikacji DirectX (using EasyHook+Slimdx)

  3. Render zawartość powierzchni urządzenia WPF za ontop haczykowatym aplikacji DirectX


Głównym Mam pytanie jest jak wykonać krok 3 przy użyciu SlimDX. Mam nadzieję, że rozwiązanie może w jakiś sposób ponownie wykorzystać powierzchnię i nie polegać na kopiowaniu, ponieważ celem jest nie wpływać na wydajność aplikacji hakowanej. Chciałbym również móc ograniczyć region i wspierać przejrzystość. Zastanawiam się również, czy użycie urządzenia Direct3d WPF w hakowanym urządzeniu aplikacji DirectX może spowodować niestabilność.

Każdy wgląd byłby doceniony, dziękuję.

+0

Jak to zrobiłeś, żeby to zrobić? Utknąłem w podobnej sytuacji. – alDiablo

Odpowiedz

1

Próbuję zrobić to samo. Co znalazłem tak daleko, że można uczynić swój wpfvisualtree na bitmapę, a następnie zapisu jest bitmap do urządzenia D3D przechwyconego w punkcie 2.

void render(Direct3D.Device device) 
{ 

wpfRenderTargetBitmap.Render(WpfVisualTree); 
wpfRenderTargetBitmap.CopyPixels(devicePtr); 

} 

testu nie zrobił tego jeszcze, ale myślę, że jestem na właściwy tor z tym. Jedyny problem, jaki mam teraz, to to, że tracę całą interaktywność z mojego okna. Kliknięcia przycisku i tak dalej nie będą przechwytywane ...

Każda pomoc w tym przypadku byłaby miła.

+0

czy osiągnąłeś sukces z tym, co robiłeś? – alDiablo