Gezeichnetes bild "Skriptübergleifend" verschicken...

  • Hey Leute...

    Ich hab 2 Scripts, die per IPC kommunizieren...

    Das eine erstellt nen Screenshot und "VERSUCHT" das erstellte Bild per IPC zum 2. Script zu schicken...
    das kommt es aber NIE an, wie es sein soll... könnt ihr mir helfen...??


    Mein Script ist quasi So aufgebaut:

    Script 1:

    [autoit]


    #Include <ScreenCapture.au3>
    #Include <GDIPlus.au3>

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

    Local $screenPic = _ScreenCapture_Capture('', 0, 0)
    $hBitmap = _GDIPlus_BitmapCreateFromHBITMAP ($screenPic)

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

    ;Verschicke: $hBitmap an Programm 2!

    [/autoit]


    Script 2:

    [autoit]


    ;incoming = $hBitmap

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

    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($w_functions)

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

    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 45, 80, 495, 250)

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

    Die Kommunikation mit IPC ist es 100 % nicht, ich weiß, dass ich immer das Handle von der Bilddatei verschicke, nicht aber das bild für sich... wie komme ich da ran, ohne es als JPG zu speichern und das zu verschicken??

    Danke für die Antworten..!!

    Einmal editiert, zuletzt von Mr_gitarre (22. September 2010 um 09:01)

  • Naja, das mit dem Zwischenspeichern wollte ich eigentlich vermeiden...

    Das bild wollte ich auslesen, per Communikation ALLE daten vom Bild übermitteln und NICHT zwischenspeicher, weißt du...??

    Und daran verzweifle ich gerade...

    Jemand ne lösung...?

  • Hi

    du musst die Bits des Screenshoots in ein Struct kopieren, dieses dann mit Exchange Variables an das 2 Script senden und dort die Bits wieder zu einem Bild machen:

    Script1.au3

    Spoiler anzeigen
    [autoit]

    #include "ExchangeVariables.au3"
    #include <ScreenCapture.au3>
    #include <WinAPI.au3>

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

    HotKeySet("{ENTER}", "_SendScreenShot")

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

    Global $bDone = False

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

    _ExchangeVariables_Startup(1, 'ExchangeVariables Send Bitmap Example')

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

    While 1
    Sleep(10)
    WEnd

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

    Func _SendScreenShot()
    Local $hBmp = _ScreenCapture_Capture()

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

    Local $hDC = _WinAPI_GetDC(0)

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

    Local $tBitmapInfo = DllStructCreate($tagBITMAPINFO)
    DllStructSetData($tBitmapInfo, "Size", DllStructGetSize($tBitmapInfo))

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

    _WinAPI_GetDIBits($hDC, $hBmp, 0, 0, 0, DllStructGetPtr($tBitmapInfo), 0)

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

    Local $iSize = DllStructGetData($tBitmapInfo, "SizeImage")
    Local $iWidth = DllStructGetData($tBitmapInfo, "Width")
    Local $iHeight = DllStructGetData($tBitmapInfo, "Height")
    DllStructSetData($tBitmapInfo, "Compression", 0); Keine Ahnung, warum man das wieder reseten muß...

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

    Local $sSize = "byte[" & $iSize & "]"
    Local $tBits = DllStructCreate($sSize)
    Local $iLines = _WinAPI_GetDIBits($hDC, $hBmp, 0, $iHeight, DllStructGetPtr($tBits), DllStructGetPtr($tBitmapInfo), 0)

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

    _WinAPI_DeleteObject($hBmp)
    _WinAPI_ReleaseDC(0, $hDC)

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

    _ExchangeVariables_SetVariable(2, "tBitmapInfo", $tBitmapInfo, $tagBITMAPINFO)
    _ExchangeVariables_SetVariable(2, "tBits", $tBits, $sSize)

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

    _ExchangeVariables_SetVariable(2, "bSent", True)

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

    $tBits = 0
    EndFunc ;==>_SendScreenShot

    [/autoit]

    Script2.au3

    Spoiler anzeigen
    [autoit]

    #include "ExchangeVariables.au3"
    #include <GDIPlus.au3>
    #include <WinAPI.au3>

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

    $pID = Run(@ScriptDir & "\Script1.exe")
    HotKeySet("{ESC}", "_Exit")

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

    Global $tBits, $tBitmapInfo, $bSent = False
    _GDIPlus_Startup()
    _ExchangeVariables_Startup(2, 'ExchangeVariables Send Bitmap Example', '_VarMsg')
    Global $hBitmap

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

    While 1
    Sleep(100)
    WEnd

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

    _GDIPlus_Shutdown()

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

    Func _VarMsg($hWnd, $iMsg, $wParam, $lparam)
    If $bSent = True Then
    Local $iWidth = DllStructGetData($tBitmapInfo, "Width")
    Local $iHeight = DllStructGetData($tBitmapInfo, "Height")

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

    Local $hDC = _WinAPI_GetDC(0)
    Local $hBmp = _WinAPI_CreateCompatibleBitmap($hDC, $iWidth, $iHeight)
    _WinAPI_SetDIBits(0, $hBmp, 0, $iHeight, DllStructGetPtr($tBits), DllStructGetPtr($tBitmapInfo), 0)
    $hBitmap = _GDIPlus_BitmapCreateFromHBITMAP($hBmp)
    _GDIPlus_ImageSaveToFile($hBitmap, @ScriptDir & "\Receive.bmp")
    _WinAPI_DeleteObject($hBmp)

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

    _WinAPI_ReleaseDC(0, $hDC)

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

    $tBits = 0
    $tBitmapInfo = 0
    $bSent = False
    MsgBox(0, "Bild erhalten", "Script 2 hat ein Bild erhalten und unter: " & @ScriptDir & "\Receive.bmp gespeichert")
    _Exit()
    EndIf
    EndFunc ;==>_VarMsg

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

    Func _Exit()
    ProcessClose($pID)
    Exit
    EndFunc ;==>_Exit

    [/autoit]

    Script1.au3 zuerst als EXE compilieren
    Script2.au3 ausführen (startet automatisch Script1.exe)
    dann Enter drücken

    mfgE

  • Na das sieht sehr gut aus...
    Eine Frage hab ich zwar noch, aber die stelle ich woanders...
    Vielen dank euch!!!