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 a 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. The best way is to declare all the required functions 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 Algorithm 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
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
If BringFront = 1 Then BringWindowToTop WndHandle
GetWindowRect WndHandle, rc
WidthSrc = rc.Right - rc.Left
HeightSrc = rc.Bottom - rc.Top
hDCSrc = GetWindowDC(WndHandle)
hDCMemory = CreateCompatibleDC(hDCSrc)
hBmp = CreateCompatibleBitmap(hDCSrc, WidthSrc, HeightSrc)
hBmpPrev = SelectObject(hDCMemory, hBmp)
Call BitBlt(hDCMemory, 0, 0, WidthSrc, HeightSrc, _
hDCSrc, 0, 0, vbSrcCopy)
hBmp = SelectObject(hDCMemory, hBmpPrev)
Call DeleteDC(hDCMemory)
Call ReleaseDC(WndHandle, hDCSrc)
With IID_IDispatch
.data1 = &H20400
.data4(0) = &HC0
.data4(7) = &H46
End With
With Pic
.Size = Len(Pic) .Type = vbPicTypeBitmap .hBmp = hBmp .hPal = 0& End With
Call OleCreatePictureIndirect(Pic, IID_IDispatch, 1, IPic)
SavePicture IPic, SavePath
GetWindowScreenshot = 1
Exit Function
ErrorHandler:
GetWindowScreenshot = 0
End Function
More Graphics Related Code
Many more easy to use and free code snippets in VB 6 are available here.
Download Source Code with Demo Application
The demo application with full source code can be downloaded from here.