Capturing Screenshot of Desktop Programatically in an Easy Way in Visual Basic






3.76/5 (11 votes)
The code shows an easy way to capture desktop to file.
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 DCCreateCompatibleDc
- Creates device context in memoryBitBlt
- 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 functionsaveimage
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
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.