Seite 1 von 1

Oculus Windows, screenshot hinter Fenstern

Verfasst: 23.01.2014 16:36
von Brügge
Hallo!

Ich arbeite im Moment sehr viel für die Oculus VR und es stört mich, dass durch die Oculus der Desktop nicht vernünftig sichtbar ist.
Erst einmal werde ich kurz die Funktionsweise der Oculus beschreiben, damit ihr eine Vorstellung habt, was mein Programm können soll =)
Die Oculus VR ist eine 3D Brille, die die linke Bildschirmseite auf das Linke Auge projiziert und die rechte Bildschirmseite auf das rechte Auge.
Wie sich bestimmt jeder jetzt denken kann ist es sehr komisch so zu arbeiten. Hinzu kommt, dass man die Bildschirmmitte nicht sieht(Nase im weg :lol: )
Mein Tool soll jetzt auf Knopfdruck den Desktop aufzeichnen und 2 mal wiedergeben (einmal links einmal rechts) damit ich innerhalb der Oculus den Rechner vernünftig bedienen kann.

Als Lösungsansatz habe ich mir folgendes überlegt und auch schon geschrieben:

ich habe ein Fenster erstellt, welches für die Maus nicht vorhanden ist. Auf diesem Fenster kann ich jetzt beliebig rum malen und wenn ich klicke klicke ich durch das Fenster durch.
(bis dahin kein Problem)

jetzt habe ich mir gedacht ich könnte einen Screenshot vom Desktop machen und den einfach 2 mal auf dieses Fenster projizieren (links und rechts)
mit ein paar tricks bekomme ich die Maus dort auch rein =)
allerdings wenn ich einen Screenshot mache, macht der auch einen Screenshot von meinem Fake-Fenster. Allerdings benötige ich ja alles was sich hinter dem Fenster befindet.
Wie kann ich also einen Screenshot von den dahinterliegenden Desktop und den anderen Fenstern generieren?

Ich hoffe jeder hier hat eine leise Vorstellung wie ich das meine xD
Vll gibt es auch eine bessere Lösung des Problems

Vielen Dank!

Re: Oculus Windows, screenshot hinter Fenstern

Verfasst: 26.01.2014 16:54
von Brügge
hi!

habe die letzten paar Tage rumprobiert... und mir ist folgende Lösung eingefallen:

ich kann Screenshots von jedem Fenster generieren mit folgendem Code:

Code: Alles auswählen

Procedure ScreenshotWindow(WindowID,imageid)
   Protected WindowRect.RECT, LibraryNr, ImageNr, hDC

   If GetWindowRect_(WindowID, @WindowRect)And WindowRect\right - WindowRect\left>0 And WindowRect\bottom - WindowRect\top >0
      ;If CreateImage(imageid, WindowRect\right - WindowRect\left, WindowRect\bottom - WindowRect\top)
        ResizeImage(imageid, WindowRect\right - WindowRect\left, WindowRect\bottom - WindowRect\top)

         hDC = StartDrawing(ImageOutput(imageid))
         If hDC
            LibraryNr = OpenLibrary(#PB_Any, "user32.dll")
            If LibraryNr
               CallFunction(LibraryNr, "PrintWindow", WindowID, hDC, 0)
               CloseLibrary(LibraryNr)
            EndIf
            StopDrawing()
            ProcedureReturn 1

         EndIf
      ;EndIf
   EndIf

   ProcedureReturn -1
EndProcedure
dazu kommt, dass ich alle Fenster, die ich offen habe raussuchen kann (mit folgenden Code):

Code: Alles auswählen

Global Dim HWNDs.l(1000)
Global count.l = 0

Procedure ListWindows(hwnd)
  count = count + 1
  HWNDs(count) = hwnd
  ProcedureReturn #True
EndProcedure

EnumChildWindows_(FindWindow_("ToolbarWindow32",#Null),@ListWindows(),0)
daraus habe ich ein kleines Programm gemacht, dass auf einem Image alle Fenster an der richtigen Position zeichnet... allerdings sind auch Fenster dabei, die nur schwarz sind und von denen ich noch nie was gehört habe...
wie kann ich die rausfiltern?
also das nur interessante Fenster gezeichnet werden?

vielen Dank!! ;)

Re: Oculus Windows, screenshot hinter Fenstern

Verfasst: 02.02.2014 09:46
von TroaX
Lass dir einfach aus interesse mal die Fensternamen ausgeben. Dann wirst du sehen können, welche Fenster die schwarzen sind. Ist zwar etwas fummelarbeit. Aber so kommst du unter Umständen auf die Lösung, wie du diese aussortieren kannst.

Da es auch für Windows Arbeitsflächenwechsler ähnlich wie Linux gibt und diese auch OpenSource (Man könnte im Code schauen wie ^^) sind würde ich vielleicht an deiner Stelle probieren, einen 2. virtuellen Desktop anzulegen und das "Fakefenster" auf einen leeren Desktop abzubilden. Dadurch sparst du auch erhebliche Rechenzeit, da du nicht bei jedem Aufruf alle Handles durchlaufen musst. Dann machste einfach einen Screenshot von Desktop A schreibst ihn ins Fenster auf Desktop B.

Allerdings sage ich gleich, das gerade Spieleentwickler damit entsprechenden Einschränkungen unterliegen. Denn die Screenshot-Funktion wird bei Spielen in Fenstern oder auch Fullscreen nur ein schwarzes Bild zeigen.

Hintergrund: Seit Windows Vista wird die Anzeige auf eine andere Art und Weise auf den Bildschirm gebracht. Bis einschließlich Windows XP wurden DirectX/OpenGL Anwendungen in einem Screenbereich auf den Desktop gezeichnet. Das heißt, das die Grafikkarte das anzuzeigende Bild Zurück an das OS gegeben hat und das OS diese Bilder in einen Screenbereich gezeichnet hat. Seit Windows Vista allerdings gibt das OS die Position und Dimension des Screenbereichs an die Grafikkarte weiter und diese zeichnet das anzuzeigende Bild derekt an den Stellen, wo es hin soll auf den Monitor. Dadurch konnte die Systemleistung zusätzlich verbessert werden (Ressourcenverbrauch vermindert). Da deine Screenshotfunktion allerdings auf OS-Ebene Arbeitet, werden Fernster mit entsprechenden Inhalt nur noch schwarz angezeigt, da das OS das Bild von der Graka garnicht erst bekommt.

Um dafür Screenshots zu erstellen kannst du nur noch hooken. Und zwar musst du dich theoretisch in die DX-Bibliothek einhängen und im Richtigen Moment die Daten, die aus dem Framebuffer kommen umleiten, kopieren und wieder zurückführen. So arbeitet zum Beispiel Fraps. Das ist aber eine ziemlich fummelige Arbeit. Außerdem darf das ganze dann nicht mit einigen Spielen genutzt werden. Währemd FRaps den meisten Herstellern bekannt ist und dort in den AntiCheat Tools FRaps die erlaubnis zum hooken hat, kann ein fremder Hook schnell zum Lahmlegen von Accounts führen.