2013-08-09 3 views
0

나는 수색에서이 "BitBlt"에 빠졌지 만 그것을 사용하는 방법을 모르겠다.BitBlt를 사용하여 스크린 샷을 캡처하는 방법은 무엇입니까?

사람들이 말하는 것은 Windows가 보여주는 화면을 캡처하는 가장 빠른 방법 인 것 같습니다. 그러나 나는 그 일에 대해 아무 말도 할 수 없다.

내가이어야으로 관리 할 수있는 유일한 것은, 방법을 시도,이 함께 : 나는 추측

gfxBmp.CopyFromScreen(0,0,0,0 rc.Size,CopyPixelOperation.CaptureBlt); 

그것을 사용? (rc.size = 특정 창의 크기) 슬프게도 아무 것도하지 않고 검은 색 그림을 얻습니다. 그러나 SourceCopy를 사용하면 정상적으로 작동하지만 정상적인 방법입니다.

나는 현재 BltBit를 사용하는 몇 가지 코드를 대체하려고했지만, 그 아니라 중 하나 일 밤은 :

public MemoryStream CaptureWindow(IntPtr hwnd, EncoderParameters JpegParam) 
    { 
     NativeMethods.Rect rc; 
     NativeMethods.GetWindowRect(hwnd, out rc); 
     using (Bitmap bmp = new Bitmap(rc.Width, rc.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb)) 
     { 

      using (Graphics gfxBmp = Graphics.FromImage(bmp)) 
      { 
       IntPtr hdcBitmap = gfxBmp.GetHdc(); 
       try 
       { 

        NativeMethods.BitBlt(hdcBitmap, 0, 0, 0, 0, hwnd, 0, 0, 0xCC0020); 

       } 
       finally 
       { 
        gfxBmp.ReleaseHdc(hdcBitmap); 
       } 
      } 
      MemoryStream ms = new MemoryStream(); 
      bmp.Save(ms, GetEncoderInfo(ImageFormat.Jpeg), JpegParam); 

      return ms; 
     } 
    } 

답변

1

자네 말이 맞아, Graphics.CopyFromScreen 이미 내부적으로 비트 블리트를 사용합니다.

// [...] 
new UIPermission(UIPermissionWindow.AllWindows).Demand(); 
int width = blockRegionSize.Width; 
int height = blockRegionSize.Height; 
using (DeviceContext deviceContext = DeviceContext.FromHwnd(IntPtr.Zero)) 
{ 
    HandleRef hSrcDC = new HandleRef(null, deviceContext.Hdc); 
    HandleRef hDC = new HandleRef(null, this.GetHdc()); 
    try 
    { 
     if (SafeNativeMethods.BitBlt(hDC, destinationX, destinationY, width, height, hSrcDC, sourceX, sourceY, (int)copyPixelOperation) == 0) 
     { 
      throw new Win32Exception(); 
     } 
    } 
    finally 
    { 
     this.ReleaseHdc(); 
    } 
} 

스크린 샷을 캡처하는 다른 가능성이 있습니다 닷넷 4.0 프레임 워크의 코드, 다음. WinAPI 함수 PrintWindow도 사용할 수 있습니다.

하지만 그래픽 카드 가속화 콘텐츠의 경우 둘 다 작동하지 않습니다. 하드웨어 오버레이는 액세스 할 수없는 GPU 메모리에 있습니다. 그래서 비디오, 게임, 게임에 자주 검은 색 이미지를 얻는 것입니다 ...

+0

? 그것도 SourceCopy와 함께 사용합니까? 코드의 경우 코드 (내 게시물의 다른 코드 세그먼트)에서이를 구현하는 방법을 모르겠다. 현재 PrintWindow를 사용하고 있습니다.하지만 창을 항상 새로 고침해야하므로 약간의 문제가 있습니다. 일부 응용 프로그램은 그렇게하지 않습니다. – Zerowalker

+0

코드는 CopyFromScreen 코드의 추출물 일뿐입니다. ILSpy (http://ilspy.net/)를 사용하여 직접 확인하십시오. –

+0

아, 그러면 왜 그렇게 쓴지 이해합니다. 흠, 그래도 어떻게 든 작동하도록 할 필요가 있습니다. 블랙 스크린 만 얻으면 BlBit으로 캡처하는 것이 중요합니다 (데스크탑이든간에). – Zerowalker

관련 문제