2014-02-09 1 views
0

direct3d 또는 opengl을 통해 드로잉을 사용하는 다른 응용 프로그램의 가능한 숨겨진 창에 대한 스크린 샷을 얻고 싶습니다. 나는이 창 콘텐츠를 받기 위해 많은 방법을 시도했지만 흑백 또는 투명한 그림 만 얻었다. 가장 가까운 것은 여기에 DWM 샘플을 사용하는 것입니다. http://bartdesmet.net/blogs/bart/archive/2006/10/05/4495.aspx 이 C# 폼 위에 창을 그립니다 만 캔트 컬러는 얻을 수 없습니다. form.drawtobitmap을 잘못 수행하면 dwm이 그린 픽셀이 누락됩니다.C#에서 DWM으로 그린 ​​픽셀의 색 얻기

DWM을 사용하여 캡처를 이미지 으로 보내거나 이미지를 내 양식에 가져 오는 방법은 무엇입니까?

답변

3

질문에 대답하려면 : GetPixel() Win32 함수를 사용할 수 있습니다. 그러나이 상황에서는 과도한 행동입니다.

Pinvoke GetPixel

MSDN GetPixel

올바른 방법

은, 장치 컨텍스트를 얻는 것입니다 비트는 콘텐츠 블럭 전송.

편집 : 나는에서 PrintWindow를 사용하여 함께 몇 가지 코드를 던져 한

. 미디어 플레이어와도 잘 작동합니다. GetWindowRect는 최소화 된 Windows에 대해 잘못된 사각형을 반환합니다. 그러나 그것은보기 흉하지 않은 출발입니다.

[StructLayout(LayoutKind.Sequential)] 
    public struct Rect 
    { 
     internal Rect(int left, int top, int right, int bottom) 
     { 
      Left = left; 
      Top = top; 
      Right = right; 
      Bottom = bottom; 
     } 

     public int Left; 
     public int Top; 
     public int Right; 
     public int Bottom; 
    } 

    [DllImport("user32.dll", SetLastError = true)] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    static extern bool PrintWindow(IntPtr hwnd, IntPtr hDC, uint nFlags); 

    [DllImport("user32.dll")] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    public static extern bool GetWindowRect(IntPtr hwnd, out Rect lpRect); 

    public void DumpWindow(IntPtr hwndSource, string filename) 
    { 
     Rect rc; 
     GetWindowRect(hwndSource, out rc); 

     var bmp = new Bitmap(rc.Right - rc.Left, rc.Bottom - rc.Top, PixelFormat.Format32bppArgb); 
     using (Graphics gBmp = Graphics.FromImage(bmp)) 
     { 
      IntPtr hdcBmp = gBmp.GetHdc(); 

      PrintWindow(hwndSource, hdcBmp, 0); 

      gBmp.ReleaseHdc(hdcBmp); 
     } 

     bmp.Save(filename); 
    } 

Edit2가 : 그리고 당신은 DWM 데모 양식에 두 번째 버튼을 추가 할 경우,이 삽입 :

private void button1_Click(object sender, EventArgs e) 
{ 
    var w = (Window)lstWindows.SelectedItem; 
    DumpWindow(w.Handle, "test.bmp"); 
    Process.Start("test.bmp"); 
} 

여전히 빈 이미지를 보여줍니다 그것을?

+1

getpixelhint에 감사드립니다. 이제 투영 된 사각형의 색상을 검색 할 수 있지만 약간의 blit도 제공합니다. – user3289727

+0

좋아, 비트 블릿 방식과 포스트 셋 코드를 tryed했지만 두 결과 모두 동일한 결과를 보여준다. http://imgur.com/07kPulZ,Hj9HSX7 (인쇄 키를 사용하여 창으로 만 가져옴)처럼 보이지만 http://imgur.com/07kPulZ,Hj9HSX7#1 – user3289727

+0

과 같이 보이게됩니다. 파일은 어떻게 생겼습니까? edit2에서 코드를 시험해보고 다시보고하십시오. – JonPall