dsktopauflösung ausgeben bei erweiterten desktop?

  • ich habe 2 displays die mit 1920x1080 im erweiterten modus laufen.
    wenn ich

    [autoit]

    MsgBox(0,"","Bildschirmbreite: "&@DesktopWidth&", Bildschirmhoehe: "&@DesktopHeight)

    [/autoit]


    ausführe wird mir 1920x1080 ausgegeben, aber ist das dann nicht nur für einen bildschirm?
    müsste ich nicht 3840x1080 haben?

    I spent 10 minutes reviewing code and thinking "What kind of drugs is this guy on?" before realizing it was something I wrote.

    • Offizieller Beitrag

    Versuch's mal damit:

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>
    #include <WinAPI.au3>
    $aRes = _GetDesktopResolution()
    _ArrayDisplay($aRes)

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

    Func _GetDesktopResolution()
    Local $aRes[4], $hWindow, $stRET
    $hWindow = _WinAPI_GetDesktopWindow()
    $stRET = _WinAPI_GetWindowPlacement($hWindow)
    If Not @error Then
    $aRes[0] = DllStructGetData($stRET, 'rcNormalPosition', 1) ; left
    $aRes[1] = DllStructGetData($stRET, 'rcNormalPosition', 2) ; top
    $aRes[2] = DllStructGetData($stRET, 'rcNormalPosition', 3) ; right
    $aRes[3] = DllStructGetData($stRET, 'rcNormalPosition', 4) ; bottom
    $stRET = 0
    Return $aRes
    Else
    Return SetError(1, 0, 0)
    EndIf
    EndFunc ;==>_GetDesktopResolution

    [/autoit]
  • Besser sollte das sein:

    Spoiler anzeigen
    [autoit]

    $SM_XVIRTUALSCREEN = 76
    ; The coordinates for the left side of the virtual screen. The virtual screen is the bounding rectangle of all display monitors. The SM_CXVIRTUALSCREEN metric is the width of the virtual screen.
    $SM_YVIRTUALSCREEN = 77
    ; The coordinates for the top of the virtual screen. The virtual screen is the bounding rectangle of all display monitors. The SM_CYVIRTUALSCREEN metric is the height of the virtual screen.
    $SM_CYVIRTUALSCREEN = 79
    ;The height of the virtual screen, in pixels. The virtual screen is the bounding rectangle of all display monitors. The SM_YVIRTUALSCREEN metric is the ;coordinates for the top of the virtual screen.
    ;und
    $SM_CXVIRTUALSCREEN = 78
    ;The width of the virtual screen, in pixels. The virtual screen is the bounding rectangle of all display monitors. The SM_XVIRTUALSCREEN metric is the ;coordinates for the left side of the virtual screen.

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

    ; und damit dann
    $w = _WinAPI_GetSystemMetrics(78)
    $h = _WinAPI_GetSystemMetrics(79)

    [/autoit]

    http://msdn.microsoft.com/en-us/library/…28VS.85%29.aspx

  • Hier eine weitere Möglichkeit:

    [autoit]


    #include <Array.au3>
    $hFullScreen = WinGetHandle("Program Manager")
    $aFullScreen = WinGetPos($hFullScreen)
    _ArrayDisplay($aFullScreen)

    [/autoit]

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • ich danke euch für die hilfe, ich habe dann die möglichkeit von UEZ genommen.

    und mit

    [autoit]

    _WinAPI_StretchBlt($hDC_GUI, 0, $y, $widht, $height, $hDC_Desktop, $aFullScreen[2]/2, $aFullScreen[1], $aFullScreen[2]/2, $aFullScreen[3],$SRCCOPY)

    [/autoit]


    das 2. display zum capturen genommen.

    problem ist jetzt nur, aber das hatte ich vorher auch schon, das ein vollbild programm nicht gecaptured wird. wenn das programm im fenstermodus läuft jedoch schon.
    kann man da was machen?

    I spent 10 minutes reviewing code and thinking "What kind of drugs is this guy on?" before realizing it was something I wrote.

  • Die Diskussion mit Screenshots von DirectX/OpenGL basierenden Fenstern per AutoIt hatten wir glaube ich schon mehr als einmal und wahren uns jedesmal einig, dass AutoIt dafür zu langsam ist bzw. eine Endscene mit AutoIt zu hooken zu kompliziert ist (erst recht für einen Anfänger).

  • Die Diskussion mit Screenshots von DirectX/OpenGL basierenden Fenstern per AutoIt hatten wir glaube ich schon mehr als einmal und wahren uns jedesmal einig, dass AutoIt dafür zu langsam ist bzw. eine Endscene mit AutoIt zu hooken zu kompliziert ist (erst recht für einen Anfänger).

    das es für anfänger wohl schwer ist merke ich. :(
    die geschwindigkeit ist relativ egal, ich will ja den im meinem fall den 2. bildschirm in einem fenster auf dem 1. bildschirm wiedergeben. es soll nur als kontrollfenster fungieren und delays sind ok.
    soweit klappt das ja auch, nur nicht, wenn auf dem 2. bildschirm etwas im vollbild laufen lasse.

    der screenshooter schaut nett aus und ich werde das tool auch in meine sammlung an nützlichen tolls aufnehmen, aber das tool zeigt schon kein bild mehr an, wenn ich mit meiner möglichkeit das bild noch sehe.
    autoit.de/wcf/attachment/13418/autoit.de/wcf/attachment/13419/

    das linke ist von screenshooter und das linke mit meinem tool.
    sobald ich aber mit dem in diesem fall MC in den vollbild modus gehe ist es auch bei mir duster. :(

    kann ich evtl. die D3D9 udf dafür nutzen?
    D3D9 Udf
    da gibt es die sektion

    [autoit]

    ;============================================================================================================================================
    ; Function: _D3D9_MemCopy($pPointer1, $pPointer2, $iSize)
    ; Description: Copies the values of $pPointer2 to $pPointer1
    ; Parameter(s): $pPointer1 - Pointer to the destination
    ; $pPointer2 - Pointer to the Source
    ; $iSize - Number of bytes to copy.

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

    ; Return Value(s): On Success - 1
    ; On Failure - 0
    ; @Error - 1 to 4 = @error of DllStructCreate with $pPointer1
    ; 5 to 8 = @error of DllStructCreate (+4) with $pPointer2
    ; Author(s): Deathly Assassin (http://www.autoitbot.de)
    ;============================================================================================================================================
    Func _D3D9_MemCopy($pPointer1, $pPointer2, $iSize)
    Local $tStructure, $tStructure2, $Err
    $tStructure = DllStructCreate("byte[" & $iSize & "]", $pPointer1)
    $Err = @error
    If $Err Then SetError($Err, 0, 0)
    $tStructure2 = DllStructCreate("byte[" & $iSize & "]", $pPointer2)
    $Err = @error
    If $Err Then SetError($Err, 0, 0)
    DllStructSetData($tStructure, 1, DllStructGetData($tStructure2, 1))
    Return 1
    EndFunc ;==>_D3D9_MemCopy

    [/autoit]

    ohne mich da nun auszukennen, liest sich das doch, wie kopiere den inhalt von X nach Y.

    [autoit]

    _D3D9_MemCopy($Sourcedisplay, $Mein_tool, $iSize)

    [/autoit]


    aber was mache ich mit $iSize?

    das würde dann ja heissen das ich das handle vom sourcefenster nehme und in meine GUI reinkopiere. theoretisch.....
    oder bin ich da auf dem holzweg?

  • die geschwindigkeit ist relativ egal, ich will ja den im meinem fall den 2. bildschirm in einem fenster auf dem 1. bildschirm wiedergeben. es soll nur als kontrollfenster fungieren und delays sind ok.


    Nein, das ist ganz bestimmt nicht egal. Um die Ausgabe eines D3D / OpenGL-Programms abgreifen zu können, musst du dich direkt in die Ausgabe einklinken und jedes (!) einzelne Bild läuft durch deine Funktion. Da AutoIt so langsam ist, gehen dadurch dann die FPS in den Keller...

    Wenn überhaupt dann funktioniert das so:
    - C-DLL, die den Hook erstellt und auf eine Nachricht des Skripts wartet
    - AutoIt-Skript, das der DLL eine Nachricht schickt, den Screenshot zu erstellen.

  • Hi,
    der Code spricht Bände^^
    Es wird, das hast du richtig erkannt, ein SPEICHERINHALT von einer Position (Pointer1) im RAM an die andere (Pointer2) kopiert.
    $size ist die Anzahl der Bytes die dabei kopiert werden.
    Leider hilft dir das bei deinem Problem nicht weiter.
    Du kannst ja mal Deskstream testen, damit funktionieren jedenfalls auch Fullscreenübertragungen diverser Spiele.
    Leider ist es immer etwas schwierig, Bildschirminhalte von Fenstern auszulesen, da eine der ersten Windows-Direktiven lautet: "Jedes Fenster ist für seinen Inhalt selbst verantwortlich!". Wenn Spieleprogrammierer (und einige andere Programme wie diverse Mediaplayer) einen eigenen Grafiktreiber installieren und darüber den FENSTERINHALT anzeigen, dann bekommt Windows davon überhaupt nichts mit!
    Ergo kann man auch nicht "einfach" an den Inhalt dieser Fenster kommen!

  • glaub mir, es reicht sogar wenn alle 250ms ein bild gemacht wird. das soll KEINE realtime monitoring software werden.
    das MC ist kein high performance programm, wo es auf jedes frame ankommt. bei den meisten leuten die sich viel mit filmen beschäftigen und ich zähle ich dazu, ist die wiederholfrequenz eh auf das doppelte der bildanzahl pro sekunde des videos eingestellt. es geht hier nicht um spiele.

    @ andi:
    einen teil von desktstream nutze ich, mir hatte sprenger120 einige teile zugänglich gemacht und ich das mit dem was ich schon hatte kombiniert.
    meine anfänge kannst du hier sehen.
    mittlerweile erinnert das das aktuelle aber nicht mehr an meine anfänge, denn aus 36 codezeilen sind über 300 geworden.
    das problem mit dem vollbild capturen bleibt aber dennoch bestehen. :(

    mir persönlich ist es echt wichtig, dass es geht, da es nur kostenpflichtige programme wie ultramon gibt. das jedoch kann bis auf die ausgabe von vollbild fenstern auch nicht viel mehr.
    test haben ergeben, das ultramon in der bildqualität und systemauslastung meinem tool schon jetzt unterlegen ist.
    ich möchte einfach eine kostenlose alternative anbieten können, die vieles ein bisschen besser macht.

    I spent 10 minutes reviewing code and thinking "What kind of drugs is this guy on?" before realizing it was something I wrote.

    Einmal editiert, zuletzt von Maximus1 (2. Juni 2011 um 18:35)

  • Zitat

    es geht hier nicht um spiele.

    Darum gehts auch nicht....
    Es geht darum, WIE deine Software (Mediaplayer) den Fensterinhalt darstellt. Wenn keine Standard-Windows-Funktionen verwendet werden, besteht nur prog@ndy´s Vorschlag, die dll (so eine besteht) des Mediaplayers auseinanderzupflücken, die Funktion zur Darstellung des Bildschirminhaltes auf deine eigene Funktion "umzubiegen" (hooken) und zu versuchen, dort im günstigsten Fall ein "Handle" zu bekommen, dass auf den Fensterinhalt zeigt....
    Wenn du dazu nicht in der Lage bist, besteht die Möglichkeit, den Bildschirminhalt über eine Video-Capture-Karte abzugreifen, also Ausgang Grafikkarte in den Eingang der Videokarte. HDMI usw ist da natürlich zu vergessen...analog geht das aber immer^^. Logischerweise funktioniert das nur bei sichtbaren Bildschirminhalten, bei erweitertem Desktop wirds da auch eng.

  • Mich würde mal interessieren, ob du es mit Ctrl+Alt+F12 versucht hast.

    Gruß,
    UEZ


    das ergebnis ist bei STRG+ALT+F12 immer noch schwarz. :(

    I spent 10 minutes reviewing code and thinking "What kind of drugs is this guy on?" before realizing it was something I wrote.

  • Schade. Ich hatte es auch mit einige Spielen probiert und ich konnte einen Screenshot erstellen.

    Danke für's Testen.

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯