Screenshot via Winsock verschicken



  • Moin,
    ich hab ein kleines Prog geschrieben, welches einen Screenshot macht.

    '----------------------------------------------------------------------------   
       FUNCTION ScreenShot( Src_hWnd AS HWND , Dsn_hWnd AS HWND ) AS INTEGER
       '----------------------------------------------------------------------------   
    
          DIM Src_hDC  AS HDC
              Src_hDC = GetDC( Src_hWnd )
          DIM Dsn_hDC AS HDC    
          DIM Rect    AS RECT
          DIM bmp     AS HBitmap
          DIM bi      AS BITMAPINFO
    
          IF Src_hWnd = 0 THEN 
             Rect.left   = 0
             Rect.top    = 0
             Rect.right  = GetSystemMetrics( SM_CXSCREEN )
             Rect.bottom = GetSystemMetrics( SM_CYSCREEN )
          END IF
    
          GetWindowRect( Src_hWnd , @Rect )
          Dsn_hDC = GetDC( Dsn_hWnd ) 
    
          DIM bmih AS BITMAPINFOHEADER  
    
          bmih.biSize=LEN( BITMAPINFOHEADER ) 
          bmih.biHeight= 480
          bmih.biWidth= 640
          bmih.biPlanes=1 
          bmih.biBitCount=24 
          bmih.biCompression=BI_RGB 
          bmih.biSizeImage = ( bmih.biWidth * bmih.biBitCount ) * bmih.biHeight + 31
          bmih.biXPelsPerMeter = 0 
          bmih.biYPelsPerMeter = 0 
          bmih.biClrImportant = 0 
          bi.bmiHeader = bmih
    
          bmp = CreateDIBSection( Src_hDC , @bi , DIB_RGB_COLORS , NULL , NULL , NULL )
    
          SelectObject( Dsn_hDC , bmp ) 
          StretchBlt( Dsn_hDC , 0 , 0 , 640 , 480 , Src_hDC , 0 , 0 , Rect.right , Rect.bottom , SRCCOPY )
    
       END FUNCTION
    

    Diesen möchte ich jetzt gerne über mein Netzwerk verschiken. Dazu benutze ich die "Winsock" lib. Mein Problem, da ich ja nur Zeichenketten verschicken kann,
    muss der Screenshot iregndwie in eine Zeichenkette. Nur wie mach ich das?

    MFG Thorben



  • Also ich würde den Screenshot in einer temporären Datei speichern, diese Datei dann schrittweise binär auslesen und nach jedem Schritt die Nullen und Einsen als Zeichenkette verschicken. Der Empfänger muss die Daten dann nur wieder in eine Datei speichern und der Sender muss seine temp. Datei löschen.

    mfg killsmaker



  • Hi,
    an dieser Stelle würde mich interessieren wie man dieses binäre Auslesen macht.
    Kannst du mal ein Beispiel dazu bringen?

    Gilb



  • send() verschickt Bytes. Warum MS sich für den Buffer gerade nen char*-Pointer ausgedacht hat weiss der Geier 😉



  • binär auslesen:

    char cZeichenkette[MAX_PATH];
    file=fopen("C:...","rb"); Im Binärlesemodus öffnen
    fread(cZeichenkette,sizeof(char),MAX_PATH,file);
    ...

    mfg killsmaker



  • geeky schrieb:

    send() verschickt Bytes. Warum MS sich für den Buffer gerade nen char*-Pointer ausgedacht hat weiss der Geier 😉

    Ähm die bauen doch auf den Berkeley Sockets auf, damit hat sich das nit MS ausgedacht^^ - hm char, glaube ich deswegen, da eben ein char ein Byte verbraucht.
    Ich mein, gut man hätte auch void* nehmen können, aber ist eigentlich auch Rille (DWORD, also unsigned long, geht da ja nicht so gut. Wär ja doof, wenn man mal nur 3 Bytes verschicken will 😉 - klingt für mich zum mindestens logisch 🙄 ).



  • Hi, ich will auch sowas ähnliches machen, aber ohne erst eine Datei anzulegen und diese wider auszulesen, aber ich komm einfach auf keinen grünen Zweig 😞
    Also meine Frage, wie müsste ich das vom Prinzip her machen wenn ich das mit winsock verschicken will? 😕



  • gosha16 schrieb:

    Also meine Frage, wie müsste ich das vom Prinzip her machen wenn ich das mit winsock verschicken will? 😕

    - Screenshot erstellen (-> GDI)
    - Speicher anfordern, den ganzen Sermon im RAM ablegen (da Du ja keine Datei anlegen); vergiss nicht den Dateiheader der Bitmap, also BITMAPINFOHEADER*.
    - Socket erstellen und Verbindung aufbauen, ggf. einen Client schreiben, das Senden und Empfangen implementieren
    - Datenblock schicken
    - Warten bis alles angekommen/verschickt ist
    - Bitmap anzeigen, bzw. Bitmap-Datei erstellen*; je nach Belieben 😉

    So sollte in etwa das Prinzip sein 💡 .

    EDIT: hm, oder meintest Du was anderes ?



  • Hm. Was issn das für ne Sprache? Hm. Egal.
    Die Bitmap kannst du mit GetObject und GetBitmapBits "serialisieren" (also "in einen Byte Block verwandeln" - den du dann eben mit send() verschicken kannst). Wenn du genau das Format einer ".bmp" Datei verwenden willst musst du dir dieses eben ansehen und dich daran halten (das hier zu erklären wäre mir etwas zu langwierig). Ansonsten packe einfach die Daten die du am anderen Ende brauchst hintereinander in einen Puffer, und übergib den dann solange an send() bis alles raus ist.
    Und: schicke vorher die Länge der folgenden Daten mit, damit du auf der Empfängerseite dann auch weisst wie gross die sind, also wie lange du die Schleife mit recv() drinnen laufen lassen musst.



  • CodeFinder schrieb:

    - Speicher anfordern, den ganzen Sermon im RAM ablegen (da Du ja keine Datei anlegen); vergiss nicht den Dateiheader der Bitmap, also BITMAPINFOHEADER*.

    Diese Stelle bereitet mir Schwierigkeiten, aber trotzdem mal ein Gedankenanstos. Ich glaube ich weis jetzt wie ich es machen muss. Danke 🙂



  • hustbaer schrieb:

    Hm. Was issn das für ne Sprache?

    Glaube Visual Basic.

    hustbaer schrieb:

    Wenn du genau das Format einer ".bmp" Datei verwenden willst musst du dir dieses eben ansehen und dich daran halten

    Jupp, glaube da steht auch etwas inner FAQ zu drin; in der MSDN sowieso 😉 .



  • Thorben schrieb in einem anderen Thread:

    Der Code ist in FreeBasic geschrieben sollte aber einfach zu erkennen sein was was ist.



  • Nagut, das "Basic" war wenigstens richtig :p .



  • - Speicher anfordern, den ganzen Sermon im RAM ablegen (da Du ja keine Datei anlegen); vergiss nicht den Dateiheader der Bitmap, also BITMAPINFOHEADER*.

    Ich will heut auch mal etwas faul sein... 🤡
    Wie mach ich das am günstigsten?(Funktionsnamen wären mir ganz lieb 😋 )



  • Nochmal: GetObject und GetBitmapBits
    Mit deinem Basic Dialekt den du da verwendest kann ich dir nicht helfen.
    Sollte der nicht mit byte Arrays umgehen können kannst du über HeapAlloc, GetProcessHeap, CopyMemory etc. arbeiten.
    Ist alles in der MSDN dokumentiert, also mach dich mal schlau.


Anmelden zum Antworten