2015-08-31 2 views
1

Я пытаюсь хранить элементы в буфере обмена в виде массива байтов.Хранить содержимое буфера обмена в массиве байтов?

У меня есть следующая функция, которая делает это для меня.

public static byte[] GetClipboardDataBytes(uint format) 
{ 
    var dataPointer = GetClipboardData(format); 

    var length = GlobalSize(dataPointer); 
    if(length == UIntPtr.Zero) 
    { 
     throw new Win32Exception(Marshal.GetLastWin32Error()); 
    } 

    var lockedMemory = GlobalLock(dataPointer); 
    if(lockedMemory == IntPtr.Zero) 
    { 
     throw new Win32Exception(Marshal.GetLastWin32Error()); 
    } 

    var buffer = new byte[(int)length]; 

    Marshal.Copy(lockedMemory, buffer, 0, (int)length); 

    GlobalUnlock(dataPointer); 

    return buffer; 
} 

Это прекрасно работает для форматов файлов (CF_HDROP) и для текстовых форматов (CF_TEXT и т.д.), но не для CF_BITMAP. В этом случае length является 0, производя следующее описание исключения:

Win32Exception (0x80004005): Недопустимый дескриптор

Я делаю что-то не так?

Невозможно ли создать общую функцию, которая всегда может извлекать стандартные форматы, доступные в буфере обмена, и хранить их?

+0

Вы используете 'Marshal.GetExceptionForHR' неправильно. 'GetLastWin32Error' не возвращает HRESULT. Используйте просто 'throw new Win32Exception();'. – IllidanS4

+0

Не доступен ли буфер обмена из .net? http://stackoverflow.com/a/899361/1808494 – Aron

+0

Спасибо @ illidans4. Я исправил свой вопрос. Я также добавил более подробную информацию о том, что происходит. –

ответ

1

То, что вы пытаетесь, невозможно. Данные буфера обмена не вынуждены передавать байт-массивы.

Примером может служить растровое изображение. Данные не являются байтовым массивом. Вы можете извлечь HBITMAP, но это не байтовый массив. Вы можете передать битмап-дескриптор в его .bmp-файл, но для этого требуется специальный код, который понимает этот конкретный формат.

Для общих форматов, о которых ваше приложение не может знать, у вас нет шансов остаться в байтовом массиве.

+0

Интересно. Давайте тогда поиграем с идеей, что я извлекаю все, что находится в буфере обмена, а затем через 10 минут * вставляю *, что ** точно ** то же данные снова. Будет ли это работать, даже если это будет «HBITMAP»? Я создаю менеджера буфера обмена, вот почему я спрашиваю. –

+0

Ответ правильный, но на самом деле, растровое изображение не очень хороший пример: большинство приложений помещают его в буфер обмена как независимый от устройства битмап-байтовый поток, а также в стандартный тип Bitmap и часто также как поток байтов PNG. Хотя, конечно, у них есть свои собственные идентификаторы типа данных. Для реального стандартного формата «битмап» это на 100% правильное. – Nyerguds

+0

Вопрос был явно о CF_BITMAP –

Смежные вопросы