Windows XP 시스템의 데스크톱 화면을 원격으로 모니터링해야하는 솔루션을 개발하려고합니다.화면 캡처 후 버퍼 데이터에 액세스 할 수 없습니다.
우리의 경험을 토대로 GDI 기반 접근 방식이 DirectX 프런트 버퍼 캡처보다 빠르다는 것을 확인했습니다.
GDI에서 우리는 다음과 같이 화면에 대한 핸들을 얻고 있습니다.
// Get the Desktop windows handle and device context
hDesktopWnd=GetDesktopWindow();
hDesktopDC=GetDC(hDesktopWnd);
// Get the handle to the existing DC and create a bitmap file object
HDC hBmpFileDC=CreateCompatibleDC(hDesktopDC);
HBITMAP hBmpFileBitmap=CreateCompatibleBitmap(hDesktopDC,nWidth,nHeight);
// Assign the object in Memory DC to the bitmap and perform a bitblt
SelectObject(hBmpFileDC,hBmpFileBitmap);
BitBlt(hBmpFileDC,0,0,nWidth,nHeight,hDesktopDC,0,0,SRCCOPY|CAPTUREBLT);
// Assign the bitmap handle to a CImage Object
CImage m_temp;
m_temp.Attach(hBmpFileBitmap);
m_temp.Save("d:\\Images\\Image10.bmp");
이 조작이 객체가 실제로 스크린으로부터 데이터를 보유하고 있음을 의미 주어진 경로의 하드 드라이브 C 화상 m_temp 객체를 저장한다. 그러나 내 응용 프로그램에서는 이미지 버퍼 포인터가 필요한 데스크톱 버퍼에서 이미지를 처리하고 싶습니다. 그러나 함수의 m_temp.GetBits() 함수를 호출하여 데이터의 포인터를 반환 할 때 NULL 포인터가 생깁니다.
BITMAP bitmap;
GetObject(hBmpFileBitmap, sizeof(BITMAP), &bitmap);
BYTE *pucInputImage = (BYTE*) bitmap.bmBits; -> Returns NULL
또는
BYTE* pucImage = NULL;
GetBitmapBits(hBmpFileBitmap,nWidth*nHeight*4,(LPVOID)pucImage);
같이
심지어 기능 (I는 m_temp 올바른 높이, 폭, 비트/화소 데이터 valiues 있지만, 화상 데이터 버퍼 포인터가 NULL 들고 볼 수) 또한 pucImage 변수에 NULL을 반환합니다. 작동하고있는 유일한 방법은 우리가 (이미지의 크기에 사전 할당) pBuf 변수와 GetDIBits 사본이 pBuf 버퍼에 처리 bitmpa로부터 데이터를 전달해야 다음
pBuf=malloc(bmpInfo.bmiHeader.biSizeImage)
GetDIBits(hdc,hBitmap,0,bmpInfo.bmiHeader.biHeight,pBuf,&bmpInfo,DIB_RGB_COLORS);
입니다. 이것은 15 밀리 초가 걸립니다.
내가 아는 한 데이터 전송은 bitblt 작업 중에 발생하며 어떻게 든이 여분의 데이터 전송으로 프레임 당 15ms 지연을 피할 수 있어야한다고 생각합니다.
데스크탑 윈도우가 사용자로부터 쓰기 금지되어 있어야하고 HDDC hBmpFileDC가 DesktopDC에서 파생되었으므로 원래 DC의 쓰기 보호 속성을 상속받을 수 있기 때문에 한 가지 더 있습니다. 이 경우, 여기
HDC hBmpFileDC=CreateCompatibleDC(hDesktopDC);
HBITMAP hBmpFileBitmap=CreateCompatibleBitmap(hDesktopDC,nWidth,nHeight);