Background info: I have this MFC application I coded and been using for a long time that pretty much automatically saves screenshots to the hard disk when the user hits the Print Screen/Alt+Print Screen key. I have been putting off using anything related to Aero until now that I've been using Windows 7 RC for a couple of weeks.
The problem: I'm using the standard GetDC/BitBlt method to capture the window contents. I have no problems with this method while doing regular full-screen grabs (no matter how many windows are opened etc). The problem arises when I try capturing the foreground window (Alt+PrintScreen). Here are two examples:
Example 1 http://indiecodelabs.com/extern/example1.jpg
Example 2 http://indiecodelabs.com/extern/example2.jpg
As you can see, I'm getting garbage where the borders should be. This is more noticeable towards the top, where we can see some duplication of the toolbar in both screenshots.
I've been googling about this for hours now and all I can find are articles saying that under DWM the BitBtl/GetDC method won't work, but can't find a single one explaining what we (the developers) should do to be able to maintain the same functionality in our apps when running on DWM.
Any help, pointers, suggestions will be greatly appreciated.
It's an excellent question that I unfortuneatly don't know exact answer to. My first idea was to grab the whole desktop and cut interesting part out of it.
I've dug into QT 4.5 sources to see how they do it, and found something like this. If you switch GetClientRect to GetWindowRect and strip QT boilerplate code you should get what you want. It looks like a hack though :)
For reference: DumpImage pretty much uses the Gdi::Bitmap's Save method. It has been omitted because it has some app-specific code that isn't relevant to the example. Also an added bonus is that if you were wondering how to include the cursor in your screengrab then the code is also there. Hope it helps. Also worth mentioning, contrary to the traditional approach, this will also include any overlaid windows you might have on top of the captured window. Also, if you use this code for full screen captures, be warned that it will not capture video game windows. I'm actually wondering how to do that properly without having to resort to DirectX. This only affects Windows Vista/7 when running in Aero mode.