2011-08-27 5 views
0

WPF를 사용하여 이미지를 클립 보드에 표시하고 있습니다. 이 기능은 그림판으로 복사하고 거기에 복사 할 때 잘 작동하지만 스크린 샷을 찍기 위해 "Print screen"을 누르면 출력과 화면 크기가 같은 검은 색 이미지 만 나타납니다.클립 보드에서 이미지 가져 오기 - 스크린 샷이 나타나면 검정색으로 표시됩니까?

어째서?

클립 보드에서 데이터를 가져 오는 코드는 다음과 같습니다 (예, 실제로 원시 API 호출을 사용하려고합니다).

... 
case CF_BITMAP: 
    BitmapSource source = null; 
    System.Drawing.Bitmap finalBitmap = null; 
    IntPtr destinationHdc = CreateCompatibleDC(IntPtr.Zero); 
    if (destinationHdc != null) 
    { 
     IntPtr sourceHdc = CreateCompatibleDC(IntPtr.Zero); 
     if (sourceHdc != null) 
     { 
      if (OpenClipboard(MainWindow.Handle)) 
      { 
       IntPtr sourceBitmap = GetClipboardData((uint)clipboardFormat); 
       SelectObject(sourceHdc, sourceBitmap); 

       BITMAP bmp; 
       GetObject(sourceBitmap, Marshal.SizeOf(typeof(BITMAP)), out bmp); 

       IntPtr destinationBitmap = CreateCompatibleBitmap(destinationHdc, bmp.bmWidth, bmp.bmHeight); 
       SelectObject(destinationHdc, destinationBitmap); 

       BitBlt(destinationHdc, 0, 0, bmp.bmWidth, bmp.bmHeight, sourceHdc, 0, 0, 0x00CC0020); 
       CloseClipboard(); 

       finalBitmap = System.Drawing.Bitmap.FromHbitmap(destinationBitmap); 
      } 
      DeleteDC(sourceHdc); 
     } 
     DeleteDC(destinationHdc); 
    } 
    if (finalBitmap != null && ((LastData == null || !(LastData is System.Drawing.Bitmap)) || !finalBitmap.EqualsTo((System.Drawing.Bitmap)LastData))) 
    { 
     source = BitmapToSource(finalBitmap); 

     if (LastData == null || source != LastData) 
     { 
      tile = new ImageTile(); 
      (tile as ImageTile).Image.Source = source; 
      tile.RawData = finalBitmap; 
     } 
    } 
    return tile; 
... 
+1

나는 특히 누군가가 pinvoke 선언을 생략 한 이후로 누군가가이 코드를 디버깅하도록 자원하고 있음을 심각하게 의심합니다. 여기 Clipboard.GetImage() 메서드를 사용하지 않는 것은 바보입니다. –

+0

Clipboard.GetImage 함수는 버그가 있습니다. 실제로 .NET 4.0에서도 확인되었습니다. 이미지의 일부 유형 (예 : 단어 문서에서 나오는 이미지)이 충돌합니다. –

+0

처음 들어 보았습니다. 필연적으로 클립 보드에 이미지를 놓는 코드의 품질에 달려 있습니다. try/catch의 문제점은 무엇입니까? –

답변

0

대신에 inbuilt 프레임 워크 메서드 인 Clipboard.GetImage()를 사용했습니다. WPF 버전은 Windows Forms보다 더 잘 작동하는 것 같습니다.

관련 문제