Skip to Content
avatar image
Former Member

Capturing a screenshot does not work in PB 12.6 anymore

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
Add comment
10|10000 characters needed characters exceeded

  • Follow
  • Get RSS Feed

1 Answer

  • May 19, 2015 at 02:14 PM

    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

    Add comment
    10|10000 characters needed characters exceeded