on 05-19-2015 2:20 PM
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
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
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
User | Count |
---|---|
84 | |
24 | |
12 | |
9 | |
7 | |
6 | |
5 | |
5 | |
4 | |
4 |
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.