Click here to Skip to main content
6,915,040 members and growing! (15,992 online)
Email Password   helpLost your password?
Languages » VB6 Interop » General     Intermediate License: The Code Project Open License (CPOL)

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

By Rajesh Naik Ponda Goa

The code shows an easy way to capture desktop to file.
VB6, VB, Windows (Win2K, WinXP, Win2003, Vista), WinForms, Dev
Revision:3 (See All)
Posted:25 Jun 2008
Updated:11 Oct 2009
Views:16,326
Bookmarked:28 times
printPrint Friendly   add Share
      Discuss Discuss   Broken Article?Report  
11 votes for this article.
Popularity: 3.64 Rating: 3.50 out of 5
1 vote, 9.1%
1
1 vote, 9.1%
2
2 votes, 18.2%
3
3 votes, 27.3%
4
4 votes, 36.4%
5

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
'
' 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.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

Rajesh Naik Ponda Goa


Member
RN Softech is a goan software development company, based at Goa, India.
Occupation: Web Developer
Company: www.rnsoftech.com
Location: India India

Other popular VB6 Interop articles:

Article Top
You must Sign In to use this message board.
FAQ FAQ 
 
Noise Tolerance  Layout  Per page   
 Msgs 1 to 5 of 5 (Total in Forum: 5) (Refresh)FirstPrevNext
Generalscreen PinmemberJufine23:27 11 Nov '09  
GeneralGood PingroupMd. Marufuzzaman20:08 11 Oct '09  
GeneralMy vote of 2 PinmvpDave Kreskowiak7:50 11 Oct '09  
I don't want to see "...in brief". An article is supposed to "...in depth". Discuss the code and the concepts behind it. Don't summarize it.
GeneralScreenshot of the entire screen Pinmemberjan wilmans2:49 24 Jul '08  
GeneralRe: Screenshot of the entire screen PinmemberRajesh Naik Ponda Goa1:56 11 Oct '09  

General General    News News    Question Question    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+PgUp/PgDown to switch pages.

PermaLink | Privacy | Terms of Use
Last Updated: 11 Oct 2009
Editor: Deeksha Shenoy
Copyright 2008 by Rajesh Naik Ponda Goa
Everything else Copyright © CodeProject, 1999-2010
Web18 | Advertise on the Code Project