Bildschrim Broadcast - performance verbessern?

  • Hi,

    ich habe ein kleines Prog geschrieben um meinen Bildschirm per Broadcast im LAN an andere Bildschirme zu verteilen.

    Geht soweit ganz gut, veilleicht hat jemand noch eine Idee wie man das noch etwas performen kann.

    Ich erstelle mir von Teilbereichen Screenshots, speichere die als JPG ab, sende die über UDF als Broadcast, der Zielrechner erstellt daraus wieder ein jpg und erstellt daraus eine Grafik im Zielfenster. Gibt es eine Möglichkeit den Weg über das zwischenspeichern zu vermeiden? Googeln hat mich da nicht wirklich weitergebracht.

    Da ich den Bildschirm nur sende wenn sich auch pixel geändert haben übergebe noch die Mauskoordinaten und bewege die am Maus Zielrechner Problem ist die Funktion MouseGetCursor. Die frisst soviel Performance, das auf meinem Rechner doppelklick kaum mehr möglich ist. Ich habe da einfach mal einen Pfeil gesetzt. Damit kann ich lerst mal eben. Wäre aber schöner wenn es was ressourcen schonendes gäbe um auch den Cursor zu übergeben.

    Das ganze ist noch ziemlich rudimentär. Ich will da noch Steuerkommandos einbauen um das Fenster am Zielrechner zu öffnen, auszublenden usw.

    Wäre schön wenn jemanden noch was dazu einfallen würde.

    Hier mal die Codes dazu.

    Client:

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>
    #include <ScreenCapture.au3>
    Dim $socket, $sdata
    UDPStartup()
    $ip = "192.168.0.255" ; Broadcast Adress
    $port1 = 65532
    $socket = UDPOpen($ip, $port1)
    If @error <> 0 Then Exit
    $maxy = @DesktopHeight
    $w = @DesktopWidth
    $pixel = PixelChecksum(0,0,$w,$maxy)
    _ScreenCapture_SetJPGQuality(55)
    _screensend()
    $mc = 2 ;-- fix value because MouseGetCursor() has poor performance
    While 1
    $mp = MouseGetPos()
    ; $mc = MouseGetCursor()
    $sdata = $mp[0] & "|" & $mp[1] & "|" & $mc & "|MSET"
    _SendUdp()
    _pixeltest()
    Sleep(10)
    WEnd
    Func _SendUdp()
    $status = UDPSend($socket, $sdata);$sdata)
    If $status = 0 then
    MsgBox(0, "ERROR", "Error while sending UDP message: " & @error)
    Exit
    EndIf
    EndFunc
    Func _pixeltest()
    $chk = PixelChecksum(0,0,$w,$maxy,10)
    If $pixel = $chk Then Return
    $pixel = $chk
    _screensend()
    EndFunc

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

    Func _screensend()
    $i = 0
    $add = 50
    While 1
    _ScreenCapture_Capture ("scr" & $i & ".jpg", 0, $i, @DesktopWidth, $i + $add,False)
    $hfile = FileOpen("scr" & $i & ".jpg",16)
    $sdata = FileRead($hfile)
    FileClose($hfile)
    $sdata = $i & "<" & $sdata
    _SendUdp()
    $i = $i + $add
    If $i > $maxy Then ExitLoop
    WEnd
    EndFunc

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

    Func OnAutoItExit()
    TCPCloseSocket($socket)
    TCPShutdown()
    EndFunc

    [/autoit]

    Server:

    Spoiler anzeigen
    [autoit]

    #include <GuiConstantsEx.au3>
    #include <GDIPlus.au3>
    #include <WindowsConstants.au3>
    UDPStartup()
    HotKeySet("^!q", "OnAutoItExit")
    MsgBox(64,"hillerConsult - Control Networks Training","Staring the viewer" & @CR & @CR & "Shutdown the viewer by pressing CTRL + ALT + Q",5)
    $ip = @IPAddress1
    $port = 65532
    $socket = UDPBind($ip, $port)
    If @error <> 0 Then Exit
    $hGUI = GUICreate("hillerConsult Control Networks Training",@DesktopWidth , @DesktopHeight,0,0,$WS_POPUP)
    $hWnd = WinGetHandle("hillerConsult Control Networks Training")
    GUISetState()
    _GDIPlus_Startup ()
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND ($hWnd)
    While 1
    $data = UDPRecv($socket, 500000)
    Select
    Case StringInStr($data,"<")
    $cnt = StringLeft($data,stringinstr($data,"<")-1)
    $data = StringTrimLeft($data,stringinstr($data,"<"))
    $fhdl = FileOpen("scr" & $cnt & ".jpg",18)
    FileWrite($fhdl,$data)
    FileClose($fhdl)
    $hBitmap = _GDIPlus_BitmapCreateFromFile ("scr" & $cnt & ".jpg")
    _GDIPlus_GraphicsDrawImage ($hGraphic, $hBitmap, 0, $cnt)
    _GDIPlus_ImageDispose ($hBitmap)
    Case StringInStr($data,"MSET")
    $mouse = StringSplit($data,"|")
    MouseMove($mouse[1],$mouse[2],1)
    GUISetCursor($mouse[3],1)
    EndSelect
    sleep(10)
    WEnd
    Func OnAutoItExit()
    UDPCloseSocket($socket)
    UDPShutdown()
    Exit
    EndFunc

    [/autoit]

    Die Variable $add im Client dient zum Einstellen, wie hoch der Bereich des Screenshots sein soll. Das hängt von der Bildschirmbreite und der Qualität des JPG ab.

    Wenn das JPG zu groß ist, bekomme ich einen Fehler beim UDPSend.

    Solche Programme gibt's zwar auch zu kaufen (TightProjector, Netcontrol usw.) Die haben aber teilweise Sachen drin die mich stören, TightProjector funktioniert unter Vista nicht wenn es mehr als eine IP Adresse gibt. Ich müsste dazu meine VMWare Adapter disablen, die brauche ich aber weil ich bei meinen Präsentationen nicht nur mit Powerpoint, sondern auch mit verschiedenen VMWare Maschinen arbeite.


    Gruß Rabbit

  • Schon mal TeamViewer probiert?

    ja, nutze ich gelegentlich für Remote Support. Wenn ich das aber bei Seminaren mit Kunden verwende macht sich die Kostenlose Version nicht gut.

    rabbit

  • VNC?

    OpenSource rules :).

    peethebee

    VNC hatte ich beim letzten Training probiert. hat leidlich funktioniert. zur Fernbedienung super, Zum Bildschirm Broadcast schlecht, weil da jeder Rechner bei mir anfragen muss.

    Anderer Grund ist, dass ich meinen Kunden öfters Lösungen mit AutoIt verkaufe. Da ist sowas als Referenz auch nicht ganz schlecht. Ich hatte erst letzens auf der Baustelle einem Kunden nebenbei einen Webzugriff auf Beleuchtungen mit Auoit demonstriert und konnte das script auch gleich verkaufen.