开发者

Working C# code for the Windows clipboard?

开发者 https://www.devze.com 2023-03-30 09:08 出处:网络
How do I convert the following C++ code (for taking a Bitmap from the Clipboard and copy it onto a form), into a WPF C# code that also uses APIs (not inbuilt Clipboard helpers from the .NET Framework)

How do I convert the following C++ code (for taking a Bitmap from the Clipboard and copy it onto a form), into a WPF C# code that also uses APIs (not inbuilt Clipboard helpers from the .NET Framework) to copy it int开发者_开发知识库o a BitmapSource (or Bitmap for that matter)?

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); 
} 

My implementation in WPF C# code is as follows. Probably awfully wrong. The thing is that I am getting a black image out of it.

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);
}


I wrote a custom implementation to workaround the bug in Clipboard.GetImage, you can find it here.


Something like this

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).

You have to create two display contexts, then you create the destination bitmap and get the source bitmap from the clipboard, then you select each bitmap into a display context, and then you call BitBlt.

But really it's a long time since I've done this stuff, I'm not making any promises.

0

精彩评论

暂无评论...
验证码 换一张
取 消