2011-08-23 61 views
0

如何將以下C++代碼(用於從剪貼板中獲取位圖並將其複製到表單中)轉換爲也使用API​​(不是來自.NET Framework的內置剪貼板幫助程序)的WPF C#代碼以將其複製到一個BitmapSource(或者這個問題的位圖)?Windows剪貼板的工作C#代碼?

hdcMem = CreateCompatibleDC(hdc); 
if (hdcMem != NULL) 
{ 
    if (OpenClipboard(hwnd)) 
    { 
     hbm = (HBITMAP) 
      GetClipboardData(uFormat); 
     SelectObject(hdcMem, hbm); 
     GetClientRect(hwnd, &rc); 

     BitBlt(hdc, 0, 0, rc.right, rc.bottom, 
      hdcMem, 0, 0, SRCCOPY); 
     CloseClipboard(); 
    } 
    DeleteDC(hdcMem); 
} 

我實現在WPF C#代碼如下。可能非常錯誤。事情是,我正在從中得到一個黑色的圖像。

IntPtr hdc = CreateCompatibleDC(IntPtr.Zero); 
IntPtr hdcMem = CreateCompatibleBitmap(hdc, 64, 64); 
if (hdcMem != null) 
{ 
    if (OpenClipboard(MainWindow.Handle)) 
    { 
     IntPtr hbm = GetClipboardData((uint)clipboardFormat); 
     SelectObject(hdcMem, hbm); 
     BitBlt(hdc, 0, 0, 64, 64, hdcMem, 0, 0, TernaryRasterOperations.SRCCOPY); 
     CloseClipboard(); 
    } 
    DeleteDC(hdcMem); 
} 
+0

你爲什麼改變原來的代碼?那是你的錯誤所在。例如,在你的版本中,hdcMem被命名,如果你認爲它是一個顯示上下文,並且它被用作好像它是一個顯示上下文(在SelectObject中),但它不是,它是一個位圖。 – john

+0

原來的代碼從剪貼板複製到屏幕上。我想從剪貼板複製到位圖。你的問題沒問題。你能幫我解決嗎? –

+1

像這樣'IntPtr hDstdc = CreateCompatibleDC(IntPtr.Zero); IntPtr hDstBm = CreateCompatibleBitmap(hDstdc,64,64); SelectObject(hDstdc,hDstBm); IntPtr hSrcdc = CreateCompatibleDC(IntPtr.Zero); ... IntPtr hDstbm = GetClipboardData((uint)clipboardFormat); SelectObject(hDstDc,hDstbm); BitBlt(hDstdc,0,0,64,64,hSrcdc,0,0,TernaryRasterOperations.SRCCOPY)'。您必須創建兩個顯示上下文,然後創建目標位圖並從剪貼板獲取源位圖,然後將每個位圖選擇到顯示上下文中,然後調用BitBlt。 – john

回答

1

像這樣的事情

IntPtr hDstdc = CreateCompatibleDC(IntPtr.Zero); 
IntPtr hDstBm = CreateCompatibleBitmap(hDstdc, 64, 64); 
SelectObject(hDstdc, hDstBm); 
IntPtr hSrcdc = CreateCompatibleDC(IntPtr.Zero); 
... 
IntPtr hSrcbm = GetClipboardData((uint)clipboardFormat); 
SelectObject(hSrcDc, hSrcbm); 
BitBlt(hDstdc, 0, 0, 64, 64, hSrcdc, 0, 0, TernaryRasterOperations.SRCCOPY). 

你必須創建兩個顯示上下文,然後創建目標位圖,並從剪貼板中的源位圖,然後選擇每個位圖到顯示上下文,然後你調用BitBlt。

但是真的很長時間以來我做了這些東西,我沒有做出任何承諾。

2

我寫了一個自定義的實現要解決的bug在Clipboard.GetImage,你可以找到它here

+0

這很酷,並讚揚它。但我想完全使用API​​編寫它,也是爲了提高我對API如何工作的瞭解。 –