2011-08-27 106 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更好。