Получение изображения из буфера обмена - черный цвет при появлении скриншотов? - PullRequest
0 голосов
/ 27 августа 2011

Я использую WPF для отображения изображения в буфере обмена. Это прекрасно работает, когда вы идете в Paint и копируете что-то там, но когда я нажимаю «Print screen», чтобы сделать скриншот, на выходе появляется просто черное изображение, которое имеет те же размеры, что и экран.

Как получилось?

Код для получения данных из буфера обмена выглядит следующим образом (да, я действительно хочу использовать необработанные вызовы API).

...
case CF_BITMAP:
    BitmapSource source = null;
    System.Drawing.Bitmap finalBitmap = null;
    IntPtr destinationHdc = CreateCompatibleDC(IntPtr.Zero);
    if (destinationHdc != null)
    {
        IntPtr sourceHdc = CreateCompatibleDC(IntPtr.Zero);
        if (sourceHdc != null)
        {
            if (OpenClipboard(MainWindow.Handle))
            {
                IntPtr sourceBitmap = GetClipboardData((uint)clipboardFormat);
                SelectObject(sourceHdc, sourceBitmap);

                BITMAP bmp;
                GetObject(sourceBitmap, Marshal.SizeOf(typeof(BITMAP)), out bmp);

                IntPtr destinationBitmap = CreateCompatibleBitmap(destinationHdc, bmp.bmWidth, bmp.bmHeight);
                SelectObject(destinationHdc, destinationBitmap);

                BitBlt(destinationHdc, 0, 0, bmp.bmWidth, bmp.bmHeight, sourceHdc, 0, 0, 0x00CC0020);
                CloseClipboard();

                finalBitmap = System.Drawing.Bitmap.FromHbitmap(destinationBitmap);
            }
            DeleteDC(sourceHdc);
        }
        DeleteDC(destinationHdc);
    }
    if (finalBitmap != null && ((LastData == null || !(LastData is System.Drawing.Bitmap)) || !finalBitmap.EqualsTo((System.Drawing.Bitmap)LastData)))
    {
        source = BitmapToSource(finalBitmap);

        if (LastData == null || source != LastData)
        {
            tile = new ImageTile();
            (tile as ImageTile).Image.Source = source;
            tile.RawData = finalBitmap;
        }
    }
    return tile;
...

1 Ответ

0 голосов
/ 29 октября 2011

В итоге я вместо этого использовал встроенный метод фреймворка Clipboard.GetImage (). Похоже, что WPF-версия работает лучше, чем Windows Forms.

...