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;
...
我认真地怀疑有人会自愿为您调试此代码,特别是因为您省略了pinvoke声明。在这里不使用Clipboard.GetImage()方法是愚蠢的。 –
Clipboard.GetImage函数是buggy,事实上已经被证实,即使对于.NET 4.0也是如此。它会崩溃某些类型的图像(例如图像来自一个word文档)。 –
首先我听说过它。虽然它不可避免地取决于将图像放在剪贴板上的代码的质量。 try/catch有什么问题? –