Screenshot



  • Ich hab den code abändern müssen so das ihn der borland builder schnallt.

    HDC hdc, hdc2;
     int width, height;
     char *filename="desk.bmp";
     hdc=GetDC(NULL);
    
     HBITMAP aBmp;
        BITMAPINFO bi;
        HGDIOBJ OldObj;
        void *dibvalues;
        HANDLE fileHandle;
    
        BITMAPFILEHEADER bmfh;
        BITMAPINFOHEADER bmih;
            DWORD bytes_write;
        DWORD bytes_written;
    
        hdc2=CreateCompatibleDC(hdc);
    
        ZeroMemory(&bmih,sizeof(BITMAPINFOHEADER));
        bmih.biSize=sizeof(BITMAPINFOHEADER);
          bmih.biHeight=height;
            bmih.biWidth=width;
            bmih.biPlanes=1;
            bmih.biBitCount=24;
        bmih.biCompression=BI_RGB;
        bmih.biSizeImage = ((((bmih.biWidth * bmih.biBitCount) + 31) & ~31) >> 3) * bmih.biHeight;
            bmih.biXPelsPerMeter = 0;
            bmih.biYPelsPerMeter = 0;
            bmih.biClrImportant = 0;
        //bmih.biSizeImage=(3*bmih.biHeight*bmih.biWidth);
            //bmih.biSizeImage = 0;
    
        bi.bmiHeader=bmih;
    
        aBmp=CreateDIBSection(hdc,&bi,DIB_RGB_COLORS,(void**)&dibvalues,NULL,NULL);
    
        if (aBmp==NULL)
        {
            OutputDebugString("CreateDIBSection failed!\n");
        }
    
        OldObj=SelectObject(hdc2,aBmp);
        BitBlt(hdc2,0,0,width,height,hdc,0,0,SRCCOPY);
    
        ZeroMemory(&bmfh,sizeof(BITMAPFILEHEADER));
        bmfh.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
        bmfh.bfSize=(3*bmih.biHeight*bmih.biWidth)+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
            bmfh.bfType=0x4d42;
            bmfh.bfReserved1 = 0;
            bmfh.bfReserved2 = 0;
    
        fileHandle=CreateFile(filename,GENERIC_READ | GENERIC_WRITE,(DWORD)0,NULL,
                                                        CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,(HANDLE) NULL);
        if (fileHandle==INVALID_HANDLE_VALUE)
        {
            OutputDebugString("CreateFile failed!\n");
        }
    
            // Write the BITMAPFILEHEADER
            bytes_write=sizeof(BITMAPFILEHEADER);
        if (!WriteFile(fileHandle,(void*)&bmfh,bytes_write,&bytes_written,NULL))
        {
            OutputDebugString("WriteFile failed!\n");
        }
    
            //Write the BITMAPINFOHEADER
        bytes_write=sizeof(BITMAPINFOHEADER);
        if (!WriteFile(fileHandle,(void*)&bmih,bytes_write,&bytes_written,NULL))
        {
            OutputDebugString("WriteFile failed!\n");
        }
    
            //Write the Color Index Array???
            bytes_write=bmih.biSizeImage;//3*bmih.biHeight*bmih.biWidth;
        if (!WriteFile(fileHandle,(void*)dibvalues,bytes_write,&bytes_written,NULL))
        {
            OutputDebugString("WriteFile failed!\n");
        }
    
        CloseHandle(fileHandle);
    
        DeleteObject(SelectObject(hdc2,OldObj));
        DeleteDC(hdc2);
    

    [ Dieser Beitrag wurde am 21.06.2003 um 22:54 Uhr von Gen.d.Pz.Tr.Seb editiert. ]
    edit: Codetags berichtigt.



  • a) Du solltest nicht die Funktion auseinanderreißen, sondern so lassen, wie sie ist und sie aus deinem Programm heraus aufrufen!

    int width, height; // werden nicht initialisiert, können also alle möglichen Werte beinhalten!
    
    // daher:
    
    bmih.biHeight=height;
    bmih.biWidth=width;
    
    /* Höhe und Breite des Bitmaps sind ?!? 0? -1000? Man weiß es nicht...
    Deshalb solltest Du Breite und Höhe in deinem Programm festlegen und 
    dann der Funktion bei Aufruf übergeben, nämlich so: */
    
    int dc2bitmap(hdc, width, height, filename);
    


  • ich werds morgen versuchen bin mir aber sicher das ich morgen wieder hier lande.



  • Soo... das mit dem Screenshot wäre geschafft.

    Danke an alle. (vor allen an hepi)

    [ Dieser Beitrag wurde am 22.06.2003 um 13:07 Uhr von Gen.d.Pz.Tr.Seb editiert. ]



  • Ich versuche auch gerade ein Screenshotprogramm zu machen und da kommt bei

    hdc = GetDC(NULL);
    

    immer der folgende Fehler

    error C2660: 'GetDC' : Funktion akzeptiert keine 1 Parameter
    Fehler beim Ausführen von cl.exe.

    Kann mir bitte wer helfen.

    Benny

    PS.: Ich bin noch ziemlich ein Newbie



  • Hast Du evtl. selber ne Funktion geschrieben mit demselben Namen ?



  • Nein ganz sicher nicht aber vielleicht liegts ja daran das ich MSVC++ 6.0 habe.

    Benny



  • Seltsam! Was hast du denn außer windows.h noch eingebunden?



  • ::GetDC(NULL)



  • wahrscheinlich verwendet er MFC oder sowas 🙄



  • Ich hab auch gerade n ähnliches Problem ... das mit dem Std. Screenshot war ja kein Thema, aber wie bekommt man die Fenster mit WS_EX_LAYERED mit ins Bild?

    Danke

    M.T.



  • Hö? 😕



  • Wenn man mit GetDC(NULL) das Bild holt, sind alle Fenster mit WS_EX_LAYERED und Transparenz unsichtbar ...

    M.T.


Anmelden zum Antworten