Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

Categories

Screen shoot

luckyboyluckyboy Member Posts: 105
hello guys
i need to take a screen shoot of the entire desktop.
I wrote the following code,
[code]
void __fastcall TForm1::Button1Click(TObject *Sender)
{
HDC hScreenDC = ::GetDC(NULL); // get Entire Desktop screen shoot
COLORREF RGB; // return value of GetPixel()
TImage *image = new TImage(this);

image->Width = Screen->Width;
image->Height = Screen->Height;

for(int x=0; xWidth; x++)
for(int y=0; yHeight; y++) {
RGB = GetPixel(hScreenDC, x, y);
image->Canvas->Pixels[x][y] = (TColor)RGB;
}
image->Picture->SaveToFile("C:\EntireDesktop.bmp");
}
[/code]
but is has some drawbacks:
1- takes too long time to finish its job (5 secs)
2- if i moved any windows, it may cause some unpredictable effect on the captured screen.
3- the result file is HUGE = 3 MB.

any one have any better trick ?!! :-( :(

Comments

  • anthrax11anthrax11 Member Posts: 511
    [link=http://msdn.microsoft.com/en-us/library/ms532334(VS.85).aspx]GetDIBits[/link] is a lot faster than GetPixel.
    I don't know anything about VCL/TImage, but a quick Google
    search found this on how to integrate it with GetDIBits:
    http://www.experts-exchange.com/Programming/Languages/CPP/Q_10023160.html
  • FleXicFleXic Member Posts: 2
    Greetings. I apologise for my English, I not so well speak. Try to keep a picture so: [code]TImage *pImage = NULL;
    TCanvas *pCanvas = NULL;

    pImage = new TImage(this);
    pCanvas = new TCanvas();

    pCanvas->Handle = GetWindowDC( GetDesktopWindow() );

    pImage->Width = pCanvas->ClipRect.Width();
    pImage->Height = pCanvas->ClipRect.Height();
    pImage->Canvas->CopyRect(pCanvas->ClipRect, pCanvas, pCanvas->ClipRect);
    pImage->Picture->SaveToFile("C:\Desktop.bmp");
    delete pImage;
    delete pCanvas;[/code]
  • luckyboyluckyboy Member Posts: 105
    thanx to all contributers
    and very special thanx to FleXic
    your method is very easy, effective, and fast
    thank you again
    Mohammad Nasim
  • luckyboyluckyboy Member Posts: 105
    by the way, "windows SDK documentation" mentioned that it is very important to release DC back to system by adding the following line of code
    [code]
    ReleaseDC(GetDesktopWindow(), pCanvas->Handle);
    [/code]
    before you delete your two pointers.

    thanks again
  • FleXicFleXic Member Posts: 2
    I am glad that have helped you)
Sign In or Register to comment.