【问题标题】:Working C# code for the Windows clipboard?适用于 Windows 剪贴板的 C# 代码?
【发布时间】:2011-11-02 05:33:53
【问题描述】:

如何将以下 C++ 代码(用于从剪贴板获取位图并将其复制到表单上)转换为也使用 API(不是 .NET Framework 中的内置剪贴板助手)的 WPF C# 代码来复制它进入 BitmapSource(或 Bitmap)?

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 中)但它不是,它是一个位图。
  • 那么原始代码从剪贴板复制到屏幕。我想从剪贴板复制到位图。你解决了我的问题。你能帮我解决吗?
  • 类似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。
  • 但是真的好久没做这些东西了,我没有做任何承诺。
  • 那行得通。将其作为解决方案发布,我会给你积分,就像你应得的一样。

标签: c# c++ wpf api gdi


【解决方案1】:

我编写了一个自定义实现来解决Clipboard.GetImage 中的错误,您可以在here 找到它。

【讨论】:

  • 这很酷,为此点赞。但我想完全使用 API 来编写它,同时提高我对 API 通常如何工作的了解。
【解决方案2】:

像这样的

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。

但实际上我已经很久没有做这些事情了,我没有做出任何承诺。

【讨论】:

    猜你喜欢
    • 2012-02-20
    • 1970-01-01
    • 2014-10-29
    • 1970-01-01
    • 2019-04-04
    • 2017-02-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多