1. BOOL CaptureWnd(int pid, CString filename)
  2. {
  3.     HWND hHwnd = NULL;
  4.     if (pid == 0)
  5.         hHwnd = GetDesktopWindow();
  6.     else
  7.     {
  8.         // explorer.exe 인 경우 전체화면
  9.         HANDLE hProcess = OpenProcess(PROCESS_VM_OPERATION | PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pid);
  10.         WCHAR buf[MAX_PATH] = {0,};
  11.         if (GetProcessImageFileName(hProcess, buf, MAX_PATH))
  12.         {
  13.             CString strFinder(buf);
  14.             strFinder.MakeUpper();
  15.             if (strFinder.Find(_T("EXPLORER.EXE")) > 0)
  16.             {
  17.                 hHwnd = GetDesktopWindow();
  18.             }
  19.         }
  20.         else
  21.         {
  22.             WCHAR buf[MAX_PATH] = {0,};
  23.             GetProcessName(pid, buf, MAX_PATH);
  24.             AfxMessageBox(buf);
  25.             RECT rect = {0,};
  26.             HWND hBackWnd = GetDesktopWindow();
  27.             GetHWNDFromPID(pid, NULL, &hBackWnd, rect);
  28.             hHwnd = hBackWnd;
  29.         }
  30.     }
  31.     if (hHwnd == NULL)
  32.         hHwnd = GetDesktopWindow();
  33.     CWnd* pWnd = CWnd::FromHandle(hHwnd);
  34.     CClientDC dc(pWnd);
  35.     CRect rect;
  36.     ::GetClientRect(hHwnd, rect);
  37.     CDC dcMem;
  38.     dcMem.CreateCompatibleDC(&dc);
  39.     CBitmap bitmap;
  40.     bitmap.CreateCompatibleBitmap(&dc, rect.Width(), rect.Height());
  41.     CBitmap* bitmapOld = dcMem.SelectObject(&bitmap);
  42.     dcMem.BitBlt(0, 0, rect.Width(), rect.Height(), &dc, 0, 0, SRCCOPY);
  43.     // Watermarking
  44.     CFont font;
  45.     font.CreateFont(12, 0, 0, 0, FW_BOLD, FALSE, FALSE, 0, DEFAULT_CHARSET,
  46.         OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
  47.         DEFAULT_PITCH | FF_SWISS, _T("굴림체"));
  48.     CFont* fontOld = dcMem.SelectObject(&font);
  49.     dcMem.SetBkMode(TRANSPARENT);
  50.     CString str = filename;
  51.     dcMem.SetTextColor(RGB(33, 255, 33));
  52.     dcMem.TextOut(20, rect.Height() - 70, str.GetBuffer(0), str.GetLength());
  53.     TCHAR buf[MAX_PATH] = {0,};
  54.     if (CUtilGlobal::GetProcessPathByPID(pid, buf))
  55.         str.Format(_T("%s (Pid=%d)"), buf, pid);
  56.     else
  57.         str.Format(_T("Get Process Path Failed (Pid=%d)"), pid);
  58.     dcMem.TextOut(20, rect.Height() - 55, str.GetBuffer(0), str.GetLength());
  59.     //str.Format(_T("(Dll:C:\\Program Files (x86)\\DreamSecurity\\NTSMagicLineMBX\\PKICertCls.dll)"));
  60.     //dcMem.TextOut(20, rect.Height() - 40, str.GetBuffer(0), str.GetLength());
  61.     // Save
  62.     CImage captureImage;
  63.     if(!captureImage.Create(rect.Width(), rect.Height(), 32))
  64.         return FALSE;
  65.     HDC hDC = captureImage.GetDC();
  66.     BitBlt(hDC, 0, 0, rect.Width(), rect.Height(), dcMem.GetSafeHdc(), 0, 0, SRCCOPY);
  67.     captureImage.Save(filename, Gdiplus::ImageFormatJPEG);
  68.     captureImage.ReleaseDC();
  69.     dcMem.SelectObject(&bitmapOld);
  70.     dcMem.SelectObject(&fontOld);
  71.     dcMem.DeleteDC();
  72.     return TRUE;
  73. }

//CaptureWnd(process id, file path);
CaptureWnd(0, _T("C:\\capture.jpg")); //전체화면
Retrieved from http://hyacinth.byus.net/moniwiki/wiki.php/C++/(Windows)캡처 윈도우
last modified 2014-12-16 17:43:32