ZitatDachte nur, dass das auslesen per DLLStruct vllt eine Hilfe wäre
Ich kannte das halt schon aus der Hilfe ;).
ZitatDachte nur, dass das auslesen per DLLStruct vllt eine Hilfe wäre
Ich kannte das halt schon aus der Hilfe ;).
Hi,
Ich hätte da einige Verbesserungsvorschläge:
1.Ersetzen des Screenshots durch Blitten (_WinApi_Bitblt()) des DeviceContext des Desktops(oder eines Fensters) in eine Bitmap. Das blitten dauert bei 1650x1080 nicht mal eine halbe Millisekunde.
2.Nochmaliges Blitten, allerdings werden die beiden Bilder nun mit XOR verknüpft. Das führt dazu, daß jedes Pixel, das seine Farbe in der Zwischenzeit NICHT geändert hat, schwarz wird.
3.Jedes Pixel, das nun nicht schwarz ist, hat also seine Farbe geändert. Die Position dieses Pixels innerhab der Bitmap wird gemerkt.
4.Es muss also nur die Position des Pixels in der Bitmap und die Farbe übertragen werden. String=pos&farbe&pos&farbe&pos&farbe....
5.Auf Empfängerseite wird jetzt die Farbe per dllstructsetdata(struct,1,farbe, position) in die Bitmap übertragen.(sehr schnell!)
Die Schwelle ist erreicht, wenn mehr als die Hälfte der Pixel die Farbe geändert haben, denn dann kann man auch gleich ein komplettes Bild übertragen
Im Prinzip gehts nur um Punkt 3. Aber genau dieses Beispiel, ein Pixel zu finden, habe ich im Assemblertut in einer Handvoll Befehlen erledigt. Ich vermute, daß man noch wesentlich weiter optimieren kann, indem man z.B. Zeilen, in denen sehr wenige geänderte Pixel vorkommen, weglässt.
Oder das Bild in 100x100 Blöcke unterteilt und nur Blöcke mit geändertem Inhalt überträgt(Blocknummer&Block). Jedenfalls wäre das eine sehr schöne Assemblerübung^^. 90% ist ja bereits im Tut abgehandelt...
Ah ja. Aber das werde ich erst machen wenn ich den ganzen anderen Kram fertig habe.
Aber ist schon mal vorgemerkt.
Hallo Sprenger120!
Hast Du inzwischen schon mal was mit Blitten gemacht?
Mich würden Beispiele zu dieser Funktion interessieren, wenn Du welche hättest!
Vielen Dank!
Veronesi
Hi veronesi,Nein tut mir leid. Aber im Forum sind haufenweise Scripte in denen _WinAPI_BitBlt verwendet wird. Ich hab mal ein Beispiel für dich gemacht wie BitBlt funktioniert.
#include <Array.au3>
#include <WinAPI.au3>
#include <GDIPlus.au3>
#include <WindowsConstants.au3>
;BitBlt Test
$hGUI = GUICreate("test", 500, 500);Gui erstellen
$hDC = _WinAPI_GetDC($hGUI);DC vom GUI ermitteln
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]$hBitmap = _WinAPI_CreateCompatibleBitmap($hDC, 500, 500);Compatibles Bitmap erstellen
$hBitmapDC = _WinAPI_CreateCompatibleDC($hDC);Compatibler DC zum Bitmap erstellen
_WinAPI_SelectObject($hBitmapDC, $hBitmap);DC auf Bitmap einstellen
[/autoit] [autoit][/autoit] [autoit]GUISetState();Gui anzeigen
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]_GDIPlus_Startup();Gdi+ initialisieren
$hGraphics = _GDIPlus_GraphicsCreateFromHDC($hBitmapDC);Graphics von Bitmap erstellen
$hWhiteBrush = _GDIPlus_BrushCreateSolid(0xFFFFFFFF);Brush für Hintergrund
$hPen = _GDIPlus_PenCreate(0xFF000000, 5);Pen für Strich
;FPS management
$timer = TimerInit()
$fps = 0
AdlibRegister("updatefps", 1000)
While 1
_GDIPlus_GraphicsFillRect($hGraphics, 0, 0, 500, 500, $hWhiteBrush);Hintergrund weiß machen
_GDIPlus_GraphicsDrawLine($hGraphics, 50, 50, 400, 400, $hPen);Strich Zeichnene
_WinAPI_BitBlt($hDC, 0, 0, 500, 500, $hBitmapDC, 0, 0, $SRCCOPY);Inhalt von der Bitmap auf den DC vom GUI Bringen
$fps += 1
WEnd
Func updatefps()
WinSetTitle($hGUI,"", "test FPS:" & Int($fps / (TimerDiff($timer) / 1000)))
EndFunc ;==>updatefps
;Resourcen entladen
_GDIPlus_PenDispose($hPen)
_GDIPlus_BrushDispose($hWhiteBrush)
_GDIPlus_GraphicsDispose($hGraphics)
_GDIPlus_Shutdown()
_WinAPI_ReleaseDC($hGUI, $hDC)
_WinAPI_DeleteObject($hBitmapDC)
_WinAPI_DeleteObject($hBitmap)
ok...
Kann mir jemand helfen, mit $var = _ScreenCapture_Capture()
Den Screenshot zu verschicken??
Bekomme doch in $var nur das Handle des Bildes, wie bekomme ich die daten, die man dann verschicken kann..??
Hi Mr_gitarre,
Was meinst du mit verschicken ? Zu einem anderen Programm oder verschicken via Datei, letzteres würde so gehen:
hier ist ein Beispiel wie man den ScreenCap speichern kann
#include <ScreenCapture.au3>
; Capture full screen
_ScreenCapture_Capture(@MyDocumentsDir & "\GDIPlus_Image1.jpg")
; Capture region
_ScreenCapture_Capture(@MyDocumentsDir & "\GDIPlus_Image2.jpg", 0, 0, 796, 596)
Na ne, aben NICHT speichern in ne Datei und dann rauslesen, da das zu lange dauert!!!
man kann doch nen ScreenShot direkt in den Speicher laden, ihn AUS DEM SPEICHER LESEN und dann verschicken, ABER WIE..?
Sprenger120
Danke!
Ich werde mir das mal genauer anschauen müssen, wenn ich etwas mehr Zeit habe!
Gruss
Veronesi
man kann doch nen ScreenShot direkt in den Speicher laden, ihn AUS DEM SPEICHER LESEN und dann verschicken, ABER WIE..?
Wohin verschicken? An einen Computer übers Internet, oder an ein anderes Programm auf dem gleichen Computer?
Ich denke mal, er möchte das an einen anderen Computer im selben (Sub)net senden.
Ja natürlich, das isn deskstream, WAS DENN SONST..!
es geht doch darum, wie man aus eben diesem Handle von der Funktion das Bild rausließt, denn mit einem verschicktem Handle kann man nichts anfangen...
Über tcp/UDP