Bildschirm per TCP senden

  • Das habe ich schon versucht mit:

    [autoit]

    Send("{PRINTSCREEN}")
    TCPSend($Socket, ClipGet())

    [/autoit]


    hat aber nicht funktioniert, weil es ja kein text ist. Aus der Hilfe zu dieser Funktion:
    Failure:
    Sets @error to 1 if clipboard is empty
    to 2 if contains a non-text entry.

    also gibt es eine Möglichkeit den Printscreen mit TCP zu versenden und das dann jede sec. ungefähr dass man ein "laufendes" bild hat.

    Ps: Ist nich zur spionage gedacht sondern zum helfen.

  • hi


    Mit _ScreenCapture_Capture speichern, im binarymode einlesen, und über binarymode verschicken?


    grez

  • _ScreenCapture_Capture oder _ScreenCapture habe ich nicht zur auswahl als function.
    Wär nett wenn du die include dazu noch posten würdest oder mit nem DLL aufruf sollte das doch auch gehen.

  • Carsten8 kannste filleicht auch noch die WinAPI.au3 und die GDIPlus.au3 posten oder sind die alle bei der neuen autoitversion dabei?

  • Hab ich gemacht und hab das programm schon fast fertig
    Es sollte (teoretisch) funktionieren aber wie ich das von mir kenne habe ich bestimmt irgendwo wiede nen Then oder nen EndIf oder soas vergessen :D
    danke für die schnelle hilfe

  • so habs nu fertig funzt aber noch nich.

    Server:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>

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

    HotKeySet("{ESC}", "_Exit")

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

    ;GUI erstellen
    GUICreate("", @DesktopWidth, @DesktopHeight, 0, 0, $WS_POPUP)
    $GPic = GUICtrlCreateGraphic(0, 0)

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

    TCPStartup()

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

    $IP = InputBox("IP-Adresse", "ZU verbindende IP-Adresse eingeben.")

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

    $MainSocket = TCPListen($IP, 1911, 128)

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

    ;Auf Client warten
    Do
    $Socket = TCPAccept( $MainSocket)
    Until $Socket >= 0

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

    ;Auf daten @DesktopHeight und @DesktopWidth vom clienten warten
    Do
    $Settings = TCPRecv($Socket, 16384)
    Sleep(25)
    Until $settings <> ""
    $Setting = StringSplit($settings, "|")

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

    ;GUI erstellen
    GUICreate("", $Setting[1], $Setting[2], 0, 0, $WS_POPUP)
    $GPic = GUICtrlCreatePic("", 0, 0, $Setting[1], $Setting[2])
    GUISetState()

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

    ;Auf Nachricht warten und anzeigen
    While True
    $message = TCPRecv($Socket, 16384)
    Sleep(25)
    If $message <> "" Then
    $FOB = FileOpen(@ScriptDir & "\Pic.bmp", 16)
    FileWrite($FOB, $message)
    FileClose($FOB)

    $message = ""
    GUICtrlSetImage($GPic, @ScriptDir & "\Pic.bmp")
    EndIf
    WEnd

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

    Func _Exit()
    TCPCloseSocket($Socket)
    TCPShutdown()
    Exit
    EndFunc

    [/autoit]


    Client:

    Spoiler anzeigen
    [autoit]

    #include <ScreenCapture.au3>

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

    HotKeySet("{ESC}", "_Exit")

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

    _ScreenCapture_SetBMPFormat(0)

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

    TCPStartup()

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

    InputBox("Deine IP Adresse", "Sende diese Nummer am Dustin per ICQ. Diese Nummer brauche ich damit das programm fumktioniert. Noch nicht auf OK klicken!!!", @IPAddress1)

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

    ;Mit Server verbinden
    $Socket = TCPConnect("192.168.0.9", 1911)
    If $Socket = -1 Then
    TrayTip("Fehler:", "Konnte nicht verbunden werden." & @CRLF & "Error code: " & @error, 5)
    Sleep(5000)
    EndIf

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

    TCPSend($Socket, @DesktopWidth & "|" & @DesktopHeight)

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

    ;Bildschirm kopieren und senden
    _ScreenCapture_Capture(@ScriptDir & "\Pic.bmp")

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

    $FOB = FileOpen(@ScriptDir & "\Pic.bmp", 16)
    $Pic = FileRead($FOB)
    FileClose($FOB)

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

    $bytes = TCPSend($Socket, $Pic)
    ToolTip($bytes)
    Sleep(5000)

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

    Func _Exit()
    TCPCloseSocket($Socket)
    TCPShutdown()
    Exit
    EndFunc

    [/autoit]

    wenn ich das auf verschiedenen pc´s ausführe dan kommt beim clienten die fehlermeldung 10060 (WSAETIMEDOUT -- Connection timed out.)
    und ich führ als erstes den serverscript auf meinem pc aus und dann der client auf nem pc von nem freund.
    ich habe auch ne Portfreigabe für meine ip adresse TCP port 1911
    ich habs auch schon mit nem anderen port versucht

  • habe das probirt aber iss nich das was ich will.
    wär nett wenn wer mir einfach mal den fehler sagt den ich da eingebaut habe.

  • Ein paar Fehler:
    1) Beim schreiben das Schrieb-Flasg vergessen
    2) Die IP im Client war hardcodded
    3) Das ganze Bild auf einmal senden ging bei mir nicht
    4) Daher Anfang- und Endmarkierungen setzen
    5) Bei Anfangsmarkierung Bild löschen, bei Endmarkierung anzeigen.

    Server
    [autoit]

    #include <GUIConstants.au3>

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

    HotKeySet("{ESC}", "_Exit")

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

    ;GUI erstellen
    GUICreate("", @DesktopWidth, @DesktopHeight, 0, 0, $WS_POPUP)
    $GPic = GUICtrlCreateGraphic(0, 0)

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

    TCPStartup()

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

    $IP = InputBox("IP-Adresse", "ZU verbindende IP-Adresse eingeben.")

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

    $MainSocket = TCPListen($IP, 1911, 128)

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

    ;Auf Client warten
    Do
    $Socket = TCPAccept( $MainSocket)
    Until $Socket >= 0

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

    ;Auf daten @DesktopHeight und @DesktopWidth vom clienten warten
    Do
    $Settings = TCPRecv($Socket, 16384)
    Sleep(25)
    Until $settings <> ""
    $Setting = StringSplit($settings, "|")

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

    ;GUI erstellen
    GUICreate("", $Setting[1], $Setting[2], 0, 0, $WS_POPUP)
    $GPic = GUICtrlCreatePic("", 0, 0, $Setting[1], $Setting[2])
    GUISetState()

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

    ;Auf Nachricht warten und anzeigen
    While True
    $show = 0
    $message = TCPRecv($Socket, 16384)
    Sleep(25)
    If $message <> "" Then
    If StringLeft($message,14) = "****ANFANG****" Then
    $message = StringTrimLeft($message,14)
    FileDelete(@ScriptDir & "\Pic.bmp")
    ElseIf StringRight($message,14) = "******ENDE****" Then
    $show = 1
    Sleep(20)
    $message = StringTrimRight($message,14)
    Sleep(20)
    EndIf
    $FOB = FileOpen(@ScriptDir & "\Pic.bmp", 17)
    FileWrite($FOB, $message)
    FileClose($FOB)
    If $show Then
    Sleep(20)
    GUICtrlSetImage($GPic, @ScriptDir & "\Pic.bmp")
    Sleep(20)
    EndIf
    $message = ""
    EndIf
    WEnd

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

    Func _Exit()
    TCPCloseSocket($Socket)
    TCPShutdown()
    Exit
    EndFunc

    [/autoit]
    Client
    [autoit]

    #include <ScreenCapture.au3>

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

    HotKeySet("{ESC}", "_Exit")

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

    _ScreenCapture_SetBMPFormat(0)

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

    TCPStartup()

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

    $Input = InputBox("Deine IP Adresse", "Sende diese Nummer am Dustin per ICQ. Diese Nummer brauche ich damit das programm fumktioniert. Noch nicht auf OK klicken!!!", @IPAddress1)

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

    ;Mit Server verbinden
    $Socket = TCPConnect($Input, 1911)
    If $Socket = -1 Then
    TrayTip("Fehler:", "Konnte nicht verbunden werden." & @CRLF & "Error code: " & @error, 5)
    Sleep(5000)
    EndIf

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

    TCPSend($Socket, @DesktopWidth & "|" & @DesktopHeight)

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

    For $i = 0 To 3
    ;Bildschirm kopieren und senden
    _ScreenCapture_Capture(@ScriptDir & "\Pic.bmp")
    TCPSend($Socket,"****ANFANG****")
    Sleep(20)
    $bytes = 0
    $FOB = FileOpen(@ScriptDir & "\Pic.bmp", 16)
    While 1

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

    $Pic = FileRead($FOB,16384)
    If @error = -1 Then ExitLoop
    $bytes += TCPSend($Socket, $Pic)

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

    WEnd
    FileClose($FOB)
    Sleep(20)
    TCPSend($Socket,"******ENDE****")
    ToolTip($bytes)
    Sleep(500)
    Next
    Sleep(5000)

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

    Func _Exit()
    TCPCloseSocket($Socket)
    TCPShutdown()
    Exit
    EndFunc

    [/autoit]


    Ungewhnt: Server zeigt an, Client sendet und Connected
    Für mich "normal": Server sendet an Client, der sich Connected hat

  • Danke vür die hilfe progandy.

    ich habe jetzt noch zwei probleme und zwar:
    1. Die pic.bmp ist 5MB groß und damit dauert es etwa 10 sec bis ein bild gesendet wurde.
    2.16384 bytes sind zu wenig und ich weis nich ob AutoIt noch mehr auf einmal verträgt.

    naja und das bild kommt immer noch net an aber die erste message mit den settings kommt an.

  • Zu 1: Ich würd anstatt bmp auf jeden Fall jpg verwendet da dieses Format komprimiert ist (also geht senden auch schneller da größe nurnoch so um 1 MB ist) falls die kompression von JPG nicht reicht dann dreh die Qualität von den Bilder mit _ScreenCapture_SetJPGQuality(PROZENT) runter (zB. _ScreenCapture_SetJPGQuality(50) dann haste nurnoch die hälfte der qualität allerdings ist die Datei auch erheblich kleiner). Hoffe das hilft dir :D

  • Das geht gar nicht.
    Es wird $File übertrage. Das ist das geschlossene Handle -> leer
    Es wird nur etwas angezeigt, da die gleiche Datei verwendet wird. Beidesmal @tempdir\bild.jpg.