Scrapping screen & saving screen shot to BMP file for Window / Desktop) programmatically in visual basic 6
Introduction
This code snippet illustrates how to
capture desktop or
any window to a
bmp file with minimum coding. It
also demonstrates a neat way to
save device context (DC) to a file on
hard disk.
Code Explanation
To capture window we can make
use of built in functions available in Windows API. To get list of
functions available in this API, use
API Viewer tool which can be added to Visual studio from
Add-Ins Manager. Here is the list of some functions used from API :
- GetWindowDc - Retrieves device context of DC
- CreateCompatibleDc - Creates device context in memory
- BitBlt - Performs pixel level transfer of data from one DC to other
How to use API functions in Visual Basic?
API Functions are
required to be declared before they are used. Best way is to declare
all the required function in a module file so that they are accessible
to any form. Example of declaration:
Private Declare Function GetWindowDC Lib "user32" Alias "GetWindowDC" (ByVal hwnd As Long) As Long
For declaration syntax of all other functions, please use “API Viewer” tool.
Code Algoritham explanation in brief
- Calculate width and height of window to copied
- Retrieve device context known as DC of window.
- Create a new device Context(DC) using API function (CreateCompatibleDC) in memory.
- Create a bitmap object using API in newly created DC.
- Copy image data from window DC to Memory DC using API function BitBlt
- From the bitmap object create Ole picture object.
- Save Olepicture to file using VB function saveimage.
Public Function GetWindowScreenshot(WndHandle As Long, SavePath As String, Optional BringFront As Integer = 1) As Long
'
' Function to create screeenshot of specified window and store at specified path
'
On Error GoTo ErrorHandler
Dim hDCSrc As Long
Dim hDCMemory As Long
Dim hBmp As Long
Dim hBmpPrev As Long
Dim WidthSrc As Long
Dim HeightSrc As Long
Dim Pic As PicBmp
Dim IPic As IPicture
Dim IID_IDispatch As guid
Dim rc As RECT
Dim pictr As PictureBox
'Bring window on top of all windows if specified
If BringFront = 1 Then BringWindowToTop WndHandle
'Get Window Size
GetWindowRect WndHandle, rc
WidthSrc = rc.Right - rc.Left
HeightSrc = rc.Bottom - rc.Top
'Get Window device context
hDCSrc = GetWindowDC(WndHandle)
'create a memory device context
hDCMemory = CreateCompatibleDC(hDCSrc)
'create a bitmap compatible with window hdc
hBmp = CreateCompatibleBitmap(hDCSrc, WidthSrc, HeightSrc)
'copy newly created bitmap into memory device context
hBmpPrev = SelectObject(hDCMemory, hBmp)
'copy window window hdc to memory hdc
Call BitBlt(hDCMemory, 0, 0, WidthSrc, HeightSrc, _
hDCSrc, 0, 0, vbSrcCopy)
'Get Bmp from memory Dc
hBmp = SelectObject(hDCMemory, hBmpPrev)
'release the created objects and free memory
Call DeleteDC(hDCMemory)
Call ReleaseDC(WndHandle, hDCSrc)
'fill in OLE IDispatch Interface ID
With IID_IDispatch
.data1 = &H20400
.data4(0) = &HC0
.data4(7) = &H46
End With
'fill Pic with necessary parts
With Pic
.Size = Len(Pic) 'Length of structure
.Type = vbPicTypeBitmap 'Type of Picture (bitmap)
.hBmp = hBmp 'Handle to bitmap
.hPal = 0& 'Handle to palette (may be null)
End With
'create OLE Picture object
Call OleCreatePictureIndirect(Pic, IID_IDispatch, 1, IPic)
'return the new Picture object
SavePicture IPic, SavePath
GetWindowScreenshot = 1
Exit Function
ErrorHandler:
GetWindowScreenshot = 0
End Function
Download Source Code with Demo Application
Demo application with full source code can be downloaded from here