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有什麼問題? –