用拷贝桌面HDC的方法抓不到QQ窗口,经试验,用键盘Print Screen键是可以抓到QQ窗口的,因此用以下方法抓屏:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | HBITMAP copyBitmap(HBITMAP hSourceHbitmap) { CDC sourceDC; CDC destDC; sourceDC.CreateCompatibleDC(NULL); destDC.CreateCompatibleDC(NULL); BITMAP bm = { 0 }; ::GetObject(hSourceHbitmap, sizeof(bm), &bm); HBITMAP hbmResult = ::CreateCompatibleBitmap(CClientDC(NULL), bm.bmWidth, bm.bmHeight); HBITMAP hbmOldSource = (HBITMAP)::SelectObject(sourceDC.m_hDC, hSourceHbitmap); HBITMAP hbmOldDest = (HBITMAP)::SelectObject(destDC.m_hDC, hbmResult); destDC.BitBlt(0, 0, bm.bmWidth, bm.bmHeight, &sourceDC, 0, 0, SRCCOPY); ::SelectObject(sourceDC.m_hDC, hbmOldSource); ::SelectObject(destDC.m_hDC, hbmOldDest); ::DeleteObject(sourceDC.m_hDC); ::DeleteObject(destDC.m_hDC); return hbmResult; } HBITMAP CSnapDlg::CaptureScreen() { keybd_event((byte)0x2c, 0, 0x0, NULL); //down keybd_event((byte)0x2c, 0, 0x2, NULL); //up Sleep(500); HBITMAP hBitmap = NULL; if (OpenClipboard()) { HBITMAP handle = (HBITMAP)GetClipboardData(CF_BITMAP); hBitmap = copyBitmap(handle); CloseClipboard(); } return hBitmap; } |