2011-08-27 156 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函數是buggy,事實上已經被證實,即使對於.NET 4.0也是如此。它會崩潰某些類型的圖像(例如圖像來自一個word文檔)。 –

+0

首先我聽說過它。雖然它不可避免地取決於將圖像放在剪貼板上的代碼的質量。 try/catch有什麼問題? –

回答

0

我結束了使用內置的框架方法,而不是Clipboard.GetImage()。它的WPF版本似乎比Windows Forms更好。