2013-07-01 17 views
0

현재 마우스 위치에서 픽셀 색상을 가져 오는 코드가 있습니다.
그것은 잘 작동하지만 유일한 문제는 내가
내가 몇 번을 시도 ... D3D 응용 프로그램에서 그것을 얻을 수 없다,하지만 그것은 단지 블랙 컬러만으로 얻을 -Directx 응용 프로그램의 Bitblt

레드 : 0
녹색 : 0
블루 : 0

여기 내 코드입니다 -

#include <stdio.h> 
#include <stdlib.h> 
#include <windows.h> 
#include <d3d9.h> 

HWND hWindow; 

HDC hScreen; 
HDC hdcMem; 
HBITMAP hBitmap; 
HGDIOBJ hOld; 

int sX, sY, x, y; 

BYTE* sData = 0; 

POINT cursorPos; 

int main() 
{ 
    int Red, Green, Blue; 

    hScreen = GetDC(hWindow); 

    sX = GetDeviceCaps(hScreen, HORZRES); 
    sY = GetDeviceCaps(hScreen, VERTRES); 

    hdcMem = CreateCompatibleDC (hScreen); 
    hBitmap = CreateCompatibleBitmap(hScreen, sX, sY); 

    BITMAPINFOHEADER bm = {0}; 
    bm.biSize = sizeof(BITMAPINFOHEADER); 
    bm.biPlanes = 1; 
    bm.biBitCount = 32; 
    bm.biWidth = sX; 
    bm.biHeight = -sY; 
    bm.biCompression = BI_RGB; 
    bm.biSizeImage = 0; // 3 * sX * sY; 

    while (1) { 
     hOld = SelectObject(hdcMem, hBitmap); 
     BitBlt(hdcMem, 0, 0, sX, sY, hScreen, 0, 0, SRCCOPY); 
     SelectObject(hdcMem, hOld); 

     free(sData); 
     sData = (BYTE*)malloc(4 * sX * sY); 

     GetDIBits(hdcMem, hBitmap, 0, sY, sData, (BITMAPINFO*)&bm, DIB_RGB_COLORS); 

     GetCursorPos(&cursorPos); 
     x = cursorPos.x; 
     y = cursorPos.y; 

     Red = sData[4 * ((y * sX) + x) +2]; 
     Green = sData[4 * ((y * sX) + x) +1]; 
     Blue = sData[4 * ((y * sX) + x)]; 

     printf("\nRed: %d\nGreen: %d\nBlue: %d\n", Red, Green, Blue); 
     Sleep(300); 
    } 
} 

감사합니다!

답변

0

어떤 종류의 d3d 응용 프로그램을 사용합니까? 응용 프로그램에서 오버레이 표면을 사용하는 경우 위의 코드로는 아무 것도 얻을 수 없습니다. 오버레이 표면은 비디오 플레이어에서 널리 사용되며 DirectX의 일반 표면과 완전히 다릅니다. 일반 스크린 샷 소프트웨어는 기본 표면의 데이터 만 캡처 할 수 있으며 Microsoft는 오버레이 표면에서 데이터를 가져 오기 위해 공용 인터페이스를 제공하지 않았지만 일부 소프트웨어 이 작업을 수행 할 수있는 가장 일반적인 방법은 다른 주제 인 DirectX를 연결하는 것입니다.

d3d 애플리케이션에서 오버레이 표면을 사용하지 않은 경우 DiretX를 사용하여 화면에서 데이터를 가져온 다음 원하는 화면 데이터에서 픽셀을 가져올 수 있습니다.

  1. 사용 CreateOffscreenPlainSurface
  2. 는 잠금 화면에서 데이터를 얻기 위해 표면을 오프 스크린 표면
  3. 사용 GetFrontBufferData을 만들고
+0

가 어떻게 어떤 종류의 알고 색상을 얻을 수있는 픽셀을 읽어 d3d? 내가 알고있는 것은 d3d9 ... –

+0

d3d 응용 프로그램의 스크린 샷 (키보드의 인쇄 화면 키 사용)을 사용하는 것이 가장 쉬운 방법입니다. 스크린 샷이 비어 있으면 오버레이 표면입니다. – zdd

+0

나는 시험을했다, 그것은 비어 있지 않았다. .. 나는 스크린 샷을 얻었다! 프런트 버퍼에 도달하는 데 도움이되는 예제 코드는 무엇입니까? 감사합니다. –