2009-11-15 8 views
1

BitBlt() 및 CreateBitmapSourceFromHBitmap()을 사용하여 WPF 응용 프로그램의 Image 요소에 표시 할 수있는 BitmapSource로 창을 캡처합니다. 그러나 어떤 이유로 인해 캡처하는 대부분의 응용 프로그램은 투명합니다. 그것에서의 윈도우의 배경이 회색 때문에BitmapSource에서 알파 제거

https://userpages.umbc.edu/~smyth1/images/screencap.PNG

그것은 그레이 : 여기에 무슨 일이 일어나고 있는지의 캡처 이미지 대 원천이다. 내가 배경을 보여 주든간에 보여줄 것이다.

캡쳐 된 이미지를 원본을보다 정확하게 반영하려면 어떻게해야합니까?

+0

당신은 몇 가지 코드가 당신이 당신의 코드를 게시 할 수 – ChrisF

+0

게시해야합니다? –

+0

http://pastebin.com/m41620c37 - 지금은 다소 혼란 스럽습니다. 하드 코딩 된 hwnd는 내 파이어 폭스 창입니다. – directedition

답변

4

코드의 문제는 사용중인 Win32 API (CreateCompatibleDC, SelectObject, CreateBitmap ...) 때문일 수 있습니다. 나는 단지 GetDCBitBlt을 사용하여 더 간단한 코드로 시도해 봤는데 잘 돌아 간다. 여기에 내 코드입니다 :

public static Bitmap Capture(IntPtr hwnd) 
    { 
     IntPtr hDC = GetDC(hwnd); 
     if (hDC != IntPtr.Zero) 
     { 
      Rectangle rect = GetWindowRectangle(hwnd); 
      Bitmap bmp = new Bitmap(rect.Width, rect.Height); 
      using (Graphics destGraphics = Graphics.FromImage(bmp)) 
      { 
       BitBlt(
        destGraphics.GetHdc(), 
        0, 
        0, 
        rect.Width, 
        rect.Height, 
        hDC, 
        0, 
        0, 
        TernaryRasterOperations.SRCCOPY); 
      } 
      return bmp; 
     } 
     return null; 
    } 

내가 윈도우 폼과 (Imaging.CreateBitmapSourceFromHBitmap와) WPF에서 그것을 시도, 그것은 (Firefox에서 SO 페이지) 같은 스크린 샷을 위해 두 경우 모두에서 잘 작동합니다.

HTH,

+0

감사합니다. GetWindowRectangle은 어디에서 찾을 수 있습니까? – directedition

+0

GetWindowPlacement API의 도우미 메서드로, 창 크기를 가져 오는 데 사용됩니다. 의미가 없기 때문에 게시하지 않았지만 원하는 경우 추가 할 수 있습니다. –

+0

게시하거나 게시자에게 연결하는 데 마음에 드시면 감사하겠습니다. – directedition