cancel
Showing results for 
Search instead for 
Did you mean: 

Capturing a screenshot does not work in PB 12.6 anymore

Former Member
0 Kudos

Hi,

I use the code of TopWiz to capure screenshots of a window. It seems that the sample doesn not work with PB 12.6 anymore (works fine for PB 11.5). The strange is: Copying to clipboard is good, but saving will end up in corrupted file. Maybe there is another behaviour handling blobs in PB.

Any ideas?


// capture bitmap and return as blob

ULong lul_hdc, lul_hdcMem, lul_hBitmap, lul_pixels

Blob lblb_header, lblb_info, lblb_bitmap

BitmapInfo lstr_Info

BitmapFileHeader lstr_Header

// Get the device context of window and allocate memory

lul_hdc = GetDC(aul_hWnd)

lul_hdcMem = CreateCompatibleDC(lul_hdc)

lul_hBitmap = CreateCompatibleBitmap(lul_hdc, aul_width, aul_height)

If lul_hBitmap <> 0 Then

    // Copy the bitmap to memory location

    SelectObject(lul_hdcMem, lul_hBitmap)

   BitBlt(lul_hdcMem, 0, 0, aul_width, aul_height, &

                        lul_hdc, aul_xpos, aul_ypos, SRCCOPY)

    // try to store the bitmap into a blob so we can save it

    lstr_Info.bmiHeader.biSize = 40

    // Get the bitmapinfo

    If GetDIBits(lul_hdcMem, lul_hBitmap, 0, aul_height, &

                            0, lstr_Info, DIB_RGB_COLORS) > 0 Then

        lul_pixels = lstr_Info.bmiHeader.biBitCount

        lstr_Info.bmiColors[lul_pixels] = 0

       

       lblb_bitmap = Blob(Space(lstr_Info.bmiHeader.biSizeImage/2))

        // get the actual bits

        GetDIBits(lul_hdcMem, lul_hBitmap, 0, aul_height, &

                            lblb_bitmap, lstr_Info, DIB_RGB_COLORS)

        // create a bitmap header

        lstr_Header.bfType = BITMAPTYPE

        lstr_Header.bfSize = lstr_Info.bmiHeader.biSizeImage

        lstr_Header.bfOffBits = 54 + (lul_pixels * 4)

        // copy the header structure to a blob

        lblb_header = Blob(Space(14/2))

        CopyBitmapFileHeader(lblb_header, lstr_Header, 14)

        // copy the info structure to a blob

        lblb_Info = Blob(Space((40  + lul_pixels * 4)/2))

        CopyBitmapInfo(lblb_Info, lstr_Info, 40 + lul_pixels * 4)

        // add all together and we have a window bitmap in a blob

        lblb_bitmap = lblb_header + lblb_info + lblb_bitmap

    End If

End If

// paste bitmap to clipboard

If ab_clipboard Then

    If OpenClipboard(aul_hWnd) Then

        EmptyClipboard()

        SetClipboardData(CF_BITMAP, lul_hBitmap)

        CloseClipboard()

    Else

        MessageBox("OpenClipboard Failed", of_GetLastError())

    End If

End If

// Clean up handles

DeleteDC(lul_hdcMem)

ReleaseDC(aul_hWnd, lul_hdc)

Return lblb_bitmap

Accepted Solutions (0)

Answers (1)

Answers (1)

arnd_schmidt
Active Contributor
0 Kudos

So if Clipboard works, your snippet is o.k., right?

Take a notice of this thread, in case that dll calls using structures are involved :

Just an idea to change the external functions that copy structures in momery to use the progma_pack ()

Subroutine CopyBitmapFileHeader ( ... )  Library "kernel32.dll" Alias For "RtlMoveMemory"  progma_pack(1)

Subroutine CopyBitmapInfo ( ... )  Library "kernel32.dll" Alias For "RtlMoveMemory" progma_pack(1)

But you need the newest EBF.

For a quick test, download the updated version of n_bitmap.sru from the topwiz site.

Arnd

Former Member
0 Kudos

I last updated the Bitmap example in 2010.