如何將以下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);
}
你爲什麼改變原來的代碼?那是你的錯誤所在。例如,在你的版本中,hdcMem被命名,如果你認爲它是一個顯示上下文,並且它被用作好像它是一個顯示上下文(在SelectObject中),但它不是,它是一個位圖。 – john
原來的代碼從剪貼板複製到屏幕上。我想從剪貼板複製到位圖。你的問題沒問題。你能幫我解決嗎? –
像這樣'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