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
#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
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
Func OnAutoItExit()
TCPCloseSocket($socket)
TCPShutdown()
EndFunc
Server:
Spoiler anzeigen
#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
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