| Author: | Eric Aling (08 sep 1999) |
| Accessed: | |
| Download: |
Some people asked me how to get the current window on the clipboard so that users could paste it in some doc or whatever. Well, you could do a Alt+PrintScreen and paste it. It would be nicer if we could automate this process from powerscript. Well, this is possibe. Check out the example pibble. What does it do? First, we get the whole desktop as image. From that image, we take the window using the coordinates and dimensions. With that we make a bitmap in memory and place it on the clipboard. Besides that, I converted the bitmap data in memory to a bitmap in a blob. Very handy if you want to save the bitmap to file. Here's some code:
uLong ll_DeskHwnd,ll_hdc,ll_hdcMem ,ll_hBitmap
uLong ll_fleft, ll_ftop, ll_fwidth , ll_fheight
uLong ll_return
// The GetDesktopWindow function returns the handle of the Windows desktop
// window. The desktop window covers the entire screen.
// The desktop window is the area on top of which all icons and
// other windows are painted.
ll_DeskHwnd = GetDesktopWindow()
// Get in pixel value the x,y,width,height of the window
// because of the powerbuilder Units (PBU)
ll_fwidth=UnitsToPixels(This.width, XUnitsToPixels!)
ll_fheight=UnitsToPixels(This.height, YUnitsToPixels!)
ll_fleft=UnitsToPixels(This.X, XUnitsToPixels!)
ll_ftop=UnitsToPixels(This.Y, YUnitsToPixels!)
//
// Get the device context of Desktop and allocate memory
//
ll_hdc = GetDC(ll_DeskHwnd)
ll_hdcMem = CreateCompatibleDC(ll_hdc)
ll_hBitmap = CreateCompatibleBitmap(ll_hdc, ll_fwidth, ll_fheight)
If ll_hBitmap <> 0 Then
ll_return = SelectObject(ll_hdcMem, ll_hBitmap)
//
// Copy the Desktop bitmap to memory location
//
ll_return = BitBlt(ll_hdcMem, 0, 0, ll_fwidth, ll_fheight, ll_hdc, ll_fleft, ll_ftop, 13369376)
//
// try to store the bitmap into a blob so we can save it
// this does not always work BTW
//
long ll_pixels = 1
str_bitmapinfo lstr_Info
str_bitmapinfo lstr_InfoDummy
str_bitmapheader lstr_Header
lstr_Info.bmiheader.bisize=40
lstr_InfoDummy.bmiheader.bisize=40
// Get the bitmapinfo
if GetDIBits(ll_hdcMem, ll_hBitmap, 0, ll_fheight, 0, lstr_Info, 0) > 0 then
if lstr_Info.bmiheader.biBitCount = 16 or &
lstr_Info.bmiheader.biBitCount = 32 then
ll_pixels = lstr_info.bmiheader.biwidth * lstr_info.bmiheader.biheight
end if
lstr_Info.bmiColor[ll_pixels] = 0
abl_data = blob(space(lstr_Info.bmiheader.bisizeimage))
// get the actual bits
GetDIBits(ll_hdcMem, ll_hBitmap, 0, ll_fheight, abl_data, lstr_Info, 0)
// create a bitmap header
lstr_Header.bfType[1] = 'B'
lstr_Header.bfType[2] = 'M'
lstr_Header.bfSize = lstr_Info.bmiheader.bisizeimage
lstr_Header.bfReserved1 = 0
lstr_Header.bfReserved2 = 0
lstr_Header.bfOffBits = 54 + (ll_pixels * 4)
// copy the header structure to a blob
blob lbl_header
lbl_header = blob(space(14))
CopyBitmapFileHeader(lbl_header, lstr_Header, 14 )
// copy the info structure to a blob
blob lbl_info
lbl_Info = blob(space(40 + ll_pixels * 4) )
CopyBitmapInfo(lbl_Info, lstr_Info, 40 + ll_pixels * 4 )
// add all together and we have a window bitmap in a blob
abl_Data = lbl_header + lbl_info + abl_Data
end if
// '---------------------------------------------
// ' Set up the Clipboard and copy bitmap
// '---------------------------------------------
ll_return = OpenClipboard(ll_DeskHwnd)
ll_return = EmptyClipboard()
ll_return = SetClipboardData(2, ll_hBitmap)
ll_return = CloseClipboard()
End If
// '---------------------------------------------
// ' Clean up handles
// '---------------------------------------------
ll_return = DeleteDC(ll_hdcMem)
ll_return = ReleaseDC(ll_DeskHwnd, ll_hdc)
return 1
Anyway, check out the example pibble. It is possible that the save of the bitmap does not work and I don't know why. It has something to do with the number of colors you are currently using for your display.
Enjoy!