Рабочий код C # для буфера обмена Windows? - PullRequest
0 голосов
/ 23 августа 2011

Как преобразовать следующий код C ++ (для получения растрового изображения из буфера обмена и его копирования в форму) в код WPF C #, который также использует API (не встроенные помощники буфера обмена из .NET Framework), чтобы скопировать егов 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);
}

Ответы [ 2 ]

2 голосов
/ 23 августа 2011

Я написал специальную реализацию для обхода ошибки в Clipboard.GetImage, вы можете найти ее здесь .

1 голос
/ 24 августа 2011

Примерно так:

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.

Но на самом деле я уже давно не занимаюсь этим, я не даю никаких обещаний.

...