Click here to Skip to main content
15,867,686 members
Articles / Desktop Programming / MFC
Article

Screen Capture to the Clipboard

Rate me:
Please Sign up or sign in to vote.
5.00/5 (27 votes)
5 Apr 2001 412.2K   98   89
How do you capture the bitmap of a window? This little download shows how, and places the bitmap on the clipboard.

Introduction

One of the common questions that I find on the microsoft.public forums is "How do I get a bitmap of a window on the screen?" Well, here's a little subroutine I used extensively in writing Win32 Programming, because I realized that for the number of illustrations I wanted for the book, there was no hope of doing screen captures and then hand-editing just the control I wanted to show. So all my Explorers have a little button somewhere that performs a screen capture of the example window and drops it into the clipboard. I could then paste it into the document, or paste it into an editor and save it as a TIFF or JPEG as well.

ToClip.h:

void toClipboard(CWnd * wnd, BOOL FullWnd);

ToClip.cpp

#include "stdafx.h"
#include "toclip.h" 
/****************************************************************
*                                 toClipboard
* Inputs:
*       CWnd * wnd: Window whose contents are to be sent 
*                   to the clipboard
*       BOOL FullWnd: TRUE for entire window, 
*                     FALSE for client area
* Result: void
*       
* Effect: 
*       Copies the contents of the client area or the window
*       to the clipboard in CF_BITMAP format.
*****************************************************************/

void toClipboard(CWnd * wnd, BOOL FullWnd)
    {
     CDC dc;
     if(FullWnd)
        { /* full window */
         HDC hdc = ::GetWindowDC(wnd->m_hWnd);
         dc.Attach(hdc);
        } /* full window */
     else
        { /* client area only */
         HDC hdc = ::GetDC(wnd->m_hWnd);
         dc.Attach(hdc);
        } /* client area only */

     CDC memDC;
     memDC.CreateCompatibleDC(&dc);

     CBitmap bm;
     CRect r;
     if(FullWnd)
        wnd->GetWindowRect(&r);
     else
         wnd->GetClientRect(&r);

     CString s;
     wnd->GetWindowText(s);
     CSize sz(r.Width(), r.Height());
     bm.CreateCompatibleBitmap(&dc, sz.cx, sz.cy);
     CBitmap * oldbm = memDC.SelectObject(&bm);
     memDC.BitBlt(0, 0, sz.cx, sz.cy, &dc, 0, 0, SRCCOPY);

     wnd->GetParent()->OpenClipboard();
     ::EmptyClipboard();
     ::SetClipboardData(CF_BITMAP, bm.m_hObject);
     CloseClipboard();

     memDC.SelectObject(oldbm);
     bm.Detach();  // make sure bitmap not deleted with CBitmap object
    }

The views expressed in these essays are those of the author, and in no way represent, nor are they endorsed by, Microsoft.

Send mail to newcomer@flounder.com with questions or comments about this article.
Copyright © 1999 All Rights Reserved
www.flounder.com/mvp_tips.htm

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


Written By
Retired
United States United States
PhD, Computer Science, Carnegie Mellon University, 1975
Certificate in Forensic Science and the Law, Duquesne University, 2008

Co-Author, [i]Win32 Programming[/i]

Comments and Discussions

 
GeneralTake a snapshot of a hidden window Pin
Member 368961631-Mar-08 3:39
Member 368961631-Mar-08 3:39 
GeneralRe: Take a snapshot of a hidden window Pin
Joseph M. Newcomer31-Mar-08 4:02
Joseph M. Newcomer31-Mar-08 4:02 
GeneralRe: Take a snapshot of a hidden window Pin
Member 368961631-Mar-08 4:58
Member 368961631-Mar-08 4:58 
GeneralRe: Take a snapshot of a hidden window Pin
Joseph M. Newcomer31-Mar-08 7:53
Joseph M. Newcomer31-Mar-08 7:53 
GeneralRe: Take a snapshot of a hidden window Pin
Member 368961631-Mar-08 8:20
Member 368961631-Mar-08 8:20 
GeneralRe: Take a snapshot of a hidden window Pin
Joseph M. Newcomer31-Mar-08 12:43
Joseph M. Newcomer31-Mar-08 12:43 
GeneralCapture MineSweeper Window Pin
SwimmerDave20-Jun-06 7:32
SwimmerDave20-Jun-06 7:32 
I was trying to make a program that could capture the minesweeper window when minesweeper is running.
I use VS 6.0 C++ running on windows XP
When I run this code the clipboard contents are a black rectangle the size of the minesweeper window.
Here's the code:

#include <windows.h>

void main() {

HWND hWnd=FindWindow(NULL,"Minesweeper");

//Find the proper dimensions
RECT r;
GetWindowRect(hWnd,&r);
int x =r.right - r.left;
int y =r.bottom - r.top;

//Find the HDC
HDC hdc= GetDC (hWnd);

HDC memDC = CreateCompatibleDC(hdc);

//Create the Bitmap
HBITMAP bm = CreateCompatibleBitmap(hdc, x, y);
SelectObject(memDC,bm);

//Post it to the Clipboard
OpenClipboard(hWnd);
EmptyClipboard();
SetClipboardData(CF_BITMAP,bm);
CloseClipboard();

ReleaseDC(hWnd,hdc);

}



Any help would be Appreciated
Thanks
GeneralRe: Capture MineSweeper Window Pin
vikrant kpr25-Jan-08 0:25
vikrant kpr25-Jan-08 0:25 
GeneralOther bitmap formats Pin
NeWi13-Oct-05 7:14
NeWi13-Oct-05 7:14 
GeneralRe: Other bitmap formats Pin
NeWi13-Oct-05 7:35
NeWi13-Oct-05 7:35 
GeneralRe: Other bitmap formats Pin
Joseph M. Newcomer18-Oct-05 7:46
Joseph M. Newcomer18-Oct-05 7:46 
Generalwindows on top interfere Pin
bbrehm652530-Aug-05 16:10
bbrehm652530-Aug-05 16:10 
GeneralRe: windows on top interfere Pin
Joseph M. Newcomer5-Sep-05 16:07
Joseph M. Newcomer5-Sep-05 16:07 
GeneralRe: windows on top interfere Pin
bbrehm65256-Sep-05 14:13
bbrehm65256-Sep-05 14:13 
GeneralCapture in Win32 - code Pin
powerpop30-Jun-05 16:20
powerpop30-Jun-05 16:20 
QuestionHow to send captured screen shot through a socket? Pin
biju_7866-May-05 7:39
biju_7866-May-05 7:39 
AnswerRe: How to send captured screen shot through a socket? Pin
James R. Twine6-May-05 8:18
James R. Twine6-May-05 8:18 
AnswerRe: How to send captured screen shot through a socket? Pin
Joseph M. Newcomer6-May-05 11:31
Joseph M. Newcomer6-May-05 11:31 
AnswerRe: How to send captured screen shot through a socket? Pin
Jagdish Vasani8-May-05 22:52
Jagdish Vasani8-May-05 22:52 
Questionhow to get image in memory? Pin
Jagdish Vasani25-Feb-05 1:00
Jagdish Vasani25-Feb-05 1:00 
AnswerRe: how to get image in memory? Pin
Joseph M. Newcomer25-Feb-05 6:18
Joseph M. Newcomer25-Feb-05 6:18 
GeneralRe: how to get image in memory? Pin
Jagdish Vasani27-Feb-05 18:13
Jagdish Vasani27-Feb-05 18:13 
GeneralRe: how to get image in memory? Pin
Joseph M. Newcomer27-Feb-05 22:02
Joseph M. Newcomer27-Feb-05 22:02 
GeneralRe: how to get image in memory? Pin
Jagdish Vasani7-Mar-05 1:13
Jagdish Vasani7-Mar-05 1:13 
GeneralRe: how to get image in memory? Pin
Joseph M. Newcomer9-Mar-05 10:40
Joseph M. Newcomer9-Mar-05 10:40 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

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