Screen Capture bei OpenGL

  • Hallo Freunde,
    ich bin auf der Suche nach einer DLL o. Ä. mit der ich einen Screenshot in einem Spiel machen kann. Bei XP funktioniert das wunderbar mit den normalen _ScreenCapture Befehlen, unter Vista/7 hab ich da einfach nur ein schwarzes Bild. Habe es auch schon mit der capturedll.dll ausm Englischen probiert, das gleiche Problem :(. Hat jemand vllt. eine passende dll oder irgend einen Codeschnipsel, der mir weiterhelfen könnte?

  • Wenn es nur darum geht einen Screenshot von einem Spiel zu machen, dann gingen auch diese Varianten auch wenn sie möglicherweise länger dauern und umständlicher sind:
    Ich würde es einmal über die Tasten Alt+Druck probieren, die Standardtasten für Screenshot (zumindest unter XP).
    Eine andere Möglichkeit wäre die Screenshotfunktion des Spieles selbst, wenn sie vorhanden ist.

  • Hey,
    okay erstmal Danke für deine Bemühungen.
    Das mit dem Delphilink hier ist schonmal sehr gut.
    Habe mir die opengl32.au3 ausm englischen Forum angesehen. Leider gibts dazu aber kein Thema, sondern lediglich nen DL ohne Erklärungen.
    Jedenfalls sind da einige DllCalls für die opengl32.dll im SystemOrdner drin.
    Unter anderem auch _glReadPixels, _glReadBuffer, _SwapBuffers, welche für die Screenshotsache notwendig sind, soweit ich weiss.
    Ich weiss jetzt nicht ob ich da aufm richtigen Weg bin, aber jedenfalls habe ich hiermal mir die Sachen zusammengelegt:
    Hab einiges von dem DelphiCode abgeschrieben und in meinen Gedanken "übersetzt", natürlich passt das hinten und vorne nicht aber naja evtl. hat von euch ja jmnd. eine kleine Ahnung und kann mir sagen ob das überhaupt Sinn macht, was ich hier betreibe oder ob das so garnicht funktionieren kann ;).

    Spoiler anzeigen
    [autoit]

    #include <array.au3>
    Global Const $GL_UNSIGNED_BYTE = 0x1401
    Global Const $GL_RGB = 0x1907
    Global Const $GL_FRONT = 0x0404
    Dim $pixel

    [/autoit] [autoit][/autoit] [autoit]

    _glReadBuffer($GL_FRONT)
    $a = _glReadPixels(1, 1, 2, 2, $GL_RGB , $GL_UNSIGNED_BYTE, $pixel)
    _ArrayDisplay($pixel)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _glReadBuffer($mode)
    DllCall( 'opengl32.dll', 'none', 'glReadBuffer', _
    'uint', $mode)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _glReadPixels($x, $y, $width, $height, $format, $type, ByRef $pixels)
    DllCall( 'opengl32.dll', 'none', 'glReadPixels', _
    'int', $x, _
    'int', $y, _
    'int', $width, _
    'int', $height, _
    'uint', $format, _
    'uint', $type, _
    'ptr', DllStructGetPtr( $pixels))
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _SwapBuffers( $hdc)
    Local $ret = DllCall( 'gdi32.dll', 'int', 'SwapBuffers', _
    'hwnd', $hdc)
    Return $ret[0]
    EndFunc

    [/autoit]