Screenshot direkt über Memory senden
Verfasst: 26.12.2012 14:47
Hallo,
ich hab folgendes vor,
ich möchte bei meinem client ein screenshot machen und der screenshot soll direkt in den memory geschrieben und dann direkt mit sendnetworkdata() versendet werden.
vom server soll das dann empfangen und dann in eine datei geschrieben werden.
Das hab ich zurzeit aber es funktioniert irgendwie nicht:
server:
client:
ich komm einfach net weiter und finde den fehler nich...
danke schonmal im vorraus
ich hab folgendes vor,
ich möchte bei meinem client ein screenshot machen und der screenshot soll direkt in den memory geschrieben und dann direkt mit sendnetworkdata() versendet werden.
vom server soll das dann empfangen und dann in eine datei geschrieben werden.
Das hab ich zurzeit aber es funktioniert irgendwie nicht:
server:
Code: Alles auswählen
InitNetwork()
If CreateNetworkServer(0, 6700)<>0
OpenWindow(0, 0, 0, 200, 20, "", #PB_Window_BorderLess)
ProgressBarGadget(0, 0, 0, 200, 20, 0, 0)
Repeat
Delay(10)
windowevent=WindowEvent()
serverevent=NetworkServerEvent()
If serverevent=#PB_NetworkEvent_Connect
Debug "Client connected"
EndIf
If serverevent=#PB_NetworkEvent_Data
Debug "Daten empfangen"
result = ReceiveNetworkData(EventClient(), @Size, 4)
Debug "Empfangene Bytes (Größe der Long (müssten 4 sein)): "+Str(result)
Debug "Empfangene Bytes (Größe des Screenshots): "+Str(Size)
If result = 4 And Size > 0
SetGadgetAttribute(0, #PB_ProgressBar_Maximum, Size)
;Allokiere Speicher in dieser Größe
*MemBuffer = AllocateMemory(Size)
errorcounter = 0
ReceivedBytes = 0
Repeat
SetGadgetState(0, ReceivedBytes)
;Speicher die Anzahl der geladenen Bytes {noch zu laden}
result = ReceiveNetworkData(EventClient(), *MemBuffer + ReceivedBytes, Size - ReceivedBytes)
If result = -1
Delay(1)
errorcounter + 1
Else
ReceivedBytes + result
errorcounter = 0
EndIf
Until ReceivedBytes = Size Or errorcounter > 6000 ; Abbruch nach 6 Sekunden
EndIf
If Size > 0 And ReceivedBytes = Size
screenshot$=GetHomeDirectory()+"Screenshot "+FormatDate("%hh-%ii-%ss", Date())+".bmp"
If CreateFile(0, screenshot$)
WriteData(0, *MemBuffer, Size)
CloseFile(0)
FreeMemory(*MemBuffer)
Else
Debug "datei konnte nicht erstellt werden"
EndIf
Else
Debug "screenshot konnte nicht heruntergeladen werden"
EndIf
EndIf
If serverevent=#PB_NetworkEvent_Disconnect
Debug "Client disconnected"
EndIf
Until windowevent=#PB_Event_CloseWindow
Else
Debug "server konnte nicht erstellt werden"
EndIfCode: Alles auswählen
Procedure MakeDesktopScreenshot(ImageNr,x,y,Width,Height)
hImage = CreateImage(ImageNr,Width,Height)
hDC = StartDrawing(ImageOutput(ImageNr))
DeskDC = GetDC_(GetDesktopWindow_())
BitBlt_(hDC,0,0,Width,Height,DeskDC,x,y,#SRCCOPY)
StopDrawing()
ReleaseDC_(GetDesktopWindow_(),DeskDC)
ProcedureReturn hImage
EndProcedure
Procedure CopyImageToMem(Img.l, mem.l)
Protected bmi.BITMAPINFO
Protected w.l, h.l, hBmp.l, hDC.l
w = ImageWidth(Img)
h = ImageHeight(Img)
hBmp = ImageID(Img)
bmi\bmiHeader\biSize = SizeOf(BITMAPINFOHEADER)
bmi\bmiHeader\biWidth = w
bmi\bmiHeader\biHeight = -h
bmi\bmiHeader\biPlanes = 1
bmi\bmiHeader\biBitCount = 32
bmi\bmiHeader\biCompression = #BI_RGB
hDC = StartDrawing( ImageOutput(Img) )
If GetDIBits_(hDC, hBmp, 0, h, mem, bmi, #DIB_RGB_COLORS)
StopDrawing()
ProcedureReturn #True
Else
StopDrawing()
ProcedureReturn #False
EndIf
EndProcedure
InitNetwork()
verbindung=OpenNetworkConnection("localhost", 6700)
If verbindung<>0
ExamineDesktops()
MakeDesktopScreenshot(0, 0, 0, DesktopWidth(0), DesktopHeight(0))
ResizeImage(0, 800, 600)
*mem=AllocateMemory(ImageWidth(0)*ImageHeight(0)*4)
If CopyImageToMem(0, *mem)=0
Debug "copy image to mem fail"
Else
Size.l=MemorySize(*mem)
Debug "Größe vom Reservierten Speicher: "+Str(Size)
x=SendNetworkData(verbindung, @Size, 4)
Debug "Gesendete Bytes (Größe der Long (müssten 4 sein)): "+Str(x)
y=SendNetworkData(verbindung, *mem, Size)
Debug "Gesendete Bytes (Größe des Screenshots): "+Str(y)
FreeMemory(*mem)
EndIf
Else
Debug "verbindung fehlgeschlagen"
EndIfdanke schonmal im vorraus