Remote Desktop

  • Morgen zusammen,

    ich habe gestern Abend mal eben eine Remote desktop programm geschrieben, jedoch lässt das Ergebnis etwas zu wünschen übrig. Da die Geschwindigkeit nicht so schnell ist und das übertragen von befehlen auch nicht so gut klappt. Es wäre also schön wenn ihr verbesserungsvorschläge hättet

    Server:

    Spoiler anzeigen
    [autoit]


    #include <String.au3>
    #include <GUIConstants.au3>
    #include <WindowsConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <Date.au3>
    #include <Misc.au3>

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

    ;Variablen
    $Serverip = "127.0.0.1"
    $Serverip = @IPAddress1
    $Resvfile = @ScriptDir & "\recive.jpg"

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

    $Packete = 0
    $Bilder = 0

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

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

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

    $Form1 = GUICreate("Server", 1100, 720, 100,10,-1,$WS_EX_TOPMOST)
    $picClient = GUICtrlCreatePic("", 0, 0, 960, 600, BitOR($SS_NOTIFY,$WS_GROUP,$WS_CLIPSIBLINGS))
    $logwin = GUICtrlCreateEdit("Start....",0,610,960,100,0x0040 + 0x00200000)
    $button1 = GUICtrlCreateButton("Maus Bewegen",1000,40,80,50)
    $button2 = GUICtrlCreateButton("Herrunterfahren",1000,100,80,50)
    $button3 = GUICtrlCreateButton("Neu Starten",1000,160,80,50)
    $button4 = GUICtrlCreateButton("Nachricht",1000,220,80,50)
    GUISetState(@SW_SHOW)

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

    Global $Maus_use = False

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

    TCPStartup()
    $server = TCPListen($serverip, 65432, 128)
    If $server = -1 Then Exit

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

    slog("IP " & @IPAddress1)
    slog("Warte auf Client")
    Do
    $Verbindung = TCPAccept($server)
    Until $Verbindung >= 0

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

    slog("Client verbunden, warte auf Daten")

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

    Local $fso

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

    Global $input_await

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

    Global $last_data
    TCPSend($Verbindung, "next|")
    While 1
    $msg = GUIGetMsg()

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

    Switch $Msg
    Case $GUI_EVENT_CLOSE
    ExitLoop
    Case $Button1
    $maus_use = Not $maus_use
    If $maus_use Then
    GUICtrlSetData($Button1,"Maus Aus")
    TCPSend($Verbindung, "maus|")
    slog("maus")
    Else
    GUICtrlSetData($Button1,"Maus")
    TCPSend($Verbindung, "mausaus|")
    slog("mausaus")
    EndIf
    Case $Button2
    TCPSend($Verbindung, "shutdown|")
    Case $Button3
    TCPSend($Verbindung, "restart|")
    Case $Button4
    $input_await = True
    Global $Input_gui = GUICreate("Input",256,156,-1,-1,$WS_EX_TOPMOST,-1,$Form1)
    Global $Input_send = GUICtrlCreateButton("Send", 10,100,236,20)
    Global $Input = GUICtrlCreateInput("",10,10,236,80)
    GUISetState()
    Case Else
    If $input_await Then
    If $msg = $input_send Then
    TCPSend($Verbindung, "message|" & GUICtrlRead($input) & "|")
    GUIDelete($input_gui)
    EndIf
    EndIf
    EndSwitch

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

    If $maus_use Then
    If _IsPressed(01) Then
    TCPSend($Verbindung, "click|")
    Else
    TCPSend($Verbindung, MouseGetPos(0) & ":" & MouseGetPos(1) & "|")
    EndIf
    EndIf

    $data = TCPRecv($Verbindung,16384);8192,4096
    If $data <> "" Then

    If StringRight($data,6) = "656E64" Then
    FileWrite($resvfile,Binary(StringTrimRight($data,6)))
    GUICtrlSetImage($picClient, $resvfile)
    FileDelete($resvfile)
    TCPSend($Verbindung, "next|")
    $Bilder += 1
    slog("# Bild fertig '" & $Bilder & "' ... fordere nächstes ")
    Sleep(20)
    Else
    $Packete += 1
    slog("# Packet empfangen '" & $Packete & "' #")
    FileWrite($resvfile,$data)
    EndIf
    Else
    Sleep(100)
    TCPSend($Verbindung, "next|")
    EndIf
    WEnd

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

    Func slog($logtext)
    GUICtrlSetData($logwin,$logtext & @CRLF & GUICtrlRead($logwin))
    EndFunc

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

    Func Raus()
    TCPCloseSocket($Verbindung)
    TCPShutdown()
    Exit 0
    EndFunc

    [/autoit]

    Client

    Spoiler anzeigen
    [autoit]


    #include <ScreenCapture.au3>
    #include <GUIConstants.au3>

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

    _ScreenCapture_SetJPGQuality(100)

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

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

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

    TCPStartup()
    $serverip = "127.0.0.1"

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

    If FileExists(@ScriptDir & "/config.ini") Then
    $serverip = IniRead(@ScriptDir & "/config.ini","config","Server IP",-1)
    Else
    $serverip = InputBox("Server IP","Geben sie die Server IP (nur einmal erforderlich ;-)")
    IniWrite(@ScriptDir & "/config.ini","config","Server IP",$serverip)
    EndIf

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

    $Socket = TCPConnect($serverip, 65432)

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

    ;TrayTip("Verbindung","Verbindung steht :-)",3)

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

    Local $pic = @ScriptDir & "\start1.jpg"

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

    Global $gui_timer

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

    While 1

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

    FileDelete($pic)
    _ScreenCapture_Capture($pic,0,0,@DesktopWidth,@DesktopHeight)
    ;$filesize = FileGetSize($pic)

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

    If $Socket <> -1 Then

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

    $weiter = True
    While $weiter

    Local $Rec = TCPRecv($Socket,1024)
    If $rec <> "" Then
    Local $splitt = StringSplit(StringLeft($rec,128),"|")

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

    If Not @error Then
    For $i = 1 To $splitt[0] Step 1

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

    Switch $splitt[$i]
    Case "maus"
    ; BlockInput(1)
    TrayTip("Info","blocked Input",3)
    Case "mausaus"
    ; BlockInput(0)
    TrayTip("Info","allow Input",3)
    Case "click"
    MouseClick("left")
    Case "shutdown"
    Shutdown(12)
    Case "restart"
    Shutdown(2)
    Case "next"
    $data = FileRead($pic)
    TCPSend($Socket,$data)
    TCPSend($Socket,"end")
    $weiter = False
    Case "message"
    If $i + 1 <= $splitt[0] Then
    Global $Info_Gui = GUICreate("Info",@DesktopWidth,@DesktopHeight,0,0,0x80000000,0x00000008)
    GUICtrlCreateLabel($splitt[$i+1],0,0,@DesktopWidth,@DesktopHeight,0x01)
    GUICtrlSetColor(-1,0xFF0000)
    GUICtrlSetFont(-1,40)
    GUISetState()
    $gui_timer = 20
    EndIf
    Case Else
    If $rec <> "" Then
    $pos = StringSplit($splitt[$i],":")
    If IsArray($pos) Then
    If UBound($pos) > 2 Then MouseMove($pos[1],$pos[2],1)
    EndIf
    EndIf
    EndSwitch
    Next
    EndIf
    EndIf

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

    If $gui_timer > 0 Then
    $gui_timer -= 1
    If $gui_timer = 1 Then GUIDelete($info_gui)
    EndIf
    WEnd

    Else
    ExitLoop
    EndIf
    WEnd

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

    Func Beenden()
    TCPCloseSocket($Socket)
    TCPShutdown()
    Exit 0
    EndFunc

    [/autoit]

    Gruß Moritz

  • Ich bezweifle das es mit autoit wirklich zzu schaffen ist das es wirklich flüssig geht (od jedenfals fast) wie in vnc z.b.

    Dafür is autoit einfach ewats zu langsam

    Computers are like Airconditioning. They don´t work with open Windows.

  • Du kannst es mit ner dll probieren, die is sicher schneller, bezweifle aber das es autoit intern viel schneller gehen wird

    mfg

    Computers are like Airconditioning. They don´t work with open Windows.

  • deathly assassin und ich (aus dem autoitbot forum) haben soetwas bereits in autoit geschafft... einwandfreies streaming per udp mit 1-3 sekunden verzögerung...
    der host hat eien kleine gui, die für den client nicht sichtbar ist, womit er verschiedene einstellungen vornehmen kann... der client hingegen kann endweder direkt die maus des hosts benutzten oder eine 2te maus benutzten... wir haben das ganze ohne dll gelöst, allerdings haben wir eine dll gescriptet, mit der das ganze noch schneller gehen soll, da der screenshoot ohne quali-fehler stark verkleinert wird :)
    ist noch nicht public und source wird auch nicht public gemacht (im jetztigen stand)... aber im grunde: es geht!

    ps: das ganze geht auch per tcp, wobei es dann antürlich länger dauert =)

    mfG

  • Ich glaube, das geht nicht mit nem ganzen Bild übertragen... Soweit ich weiß empfängt der client eigentlich nur
    Den Teil des Bildes, der sich verändert hat... so ist die Übertragung weit schneller...

    Theorie ist wenn man weiß wie's geht, aber nichts klappt.
    Praxis ist wenn's klappt aber man weiß nicht weiso.

    Bei Microsoft sind Theorie und Praxis vereint: Nichts klappt und keiner weiß wieso ;)

  • Naja ich denke das ganze kommt ganz auf die auflösung an. Wenn man nicht nen Bildschrim mit Auflösung 1920x1200 (ca 2,4 Mio Pixel !!) übertragen möchte sondern nur 800x600 (oder kleiner) denke ich wird sowas sogar auch mit autoit möglich sein.

  • Naja ich könnte mir natürlich mit c++ ne hübsches dll basteln, welches mit das bild schön komprimiert und eben nur die Enderungen herausfiltert, aber dann könnte ich auch einfach teamviewer benutzen. Naja ich denke ich werde projekt abharken müssen, da kann man das wohl nix machen.

  • sry ne:

    Zitat

    ist noch nicht public und source wird auch nicht public gemacht (im jetztigen stand)...

  • server startet udp und wartet auf eingehende verbindung
    client startet udp und verbindet mit dem server
    server bemerkt verbindung macht nen screenshot und splittet das bild in kleine teile
    server sendet die anzahl der teile und die kleinen teile an sich
    client empfängt die teile und setzt sie zusammen, überprüft anzahl (falls anzahl falsch wird eine erneute anfrage gesendet)
    client sendet bestätigung
    server übrprüft desktop auf veränderungen und sendet nur den veränderten bereich wieder in kleinen teilen
    client empfängt diese setzt zusammen und schneidet ins aktuelle bild ein...

    hoffe ist klar :)

  • hab zur zeit son remote desktop projekt am laufen...funktioniert auch schon ganz gut (und es werden auch nur die bilder geschickt, die sich ändern, die sind in der regel 20 kb bei 50x50)

    das einzige problem was ich habe, ist dass die _ScreenCapure funktion, ziemlich lahm ist...die braucht vlt für ein bild um die 15ms und bei mehreren bildern saugt das echt Leistung...vlt kennt ja jemand ne alternative...