2012-11-05 6 views
0

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); 

답변

0

(아래 그림 참조) 새로 만든 변수에 같은 문제를이 쓰기 방지를 표시하는 몇 가지 방법이 있지만, VB 언어입니다. 문제는 우리가 메모리 객체에 디바이스 독립을 생성하고 있지만, 소스가 DDB (디바이스 종속 비트 맵) 인 것으로 생각합니다. 데스크탑 비트 맵은 VRAM에서 호스트되기 때문에 RAM이 아닌 VRAM 포인터가 있어야합니다. 그런 식으로 GetObject 등의 함수는 null pointer을 반환합니다. .bmwidth, .bmheight, .bmtype과 같은 기타 모든 항목은 정상입니다. 저는 이미지를 압축 + 전송을위한 스트림으로 처리해야하기 때문에 매우 좌절합니다.

관련 문제