Я пытаюсь хранить элементы в буфере обмена в виде массива байтов.Хранить содержимое буфера обмена в массиве байтов?
У меня есть следующая функция, которая делает это для меня.
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): Недопустимый дескриптор
Я делаю что-то не так?
Невозможно ли создать общую функцию, которая всегда может извлекать стандартные форматы, доступные в буфере обмена, и хранить их?
Вы используете 'Marshal.GetExceptionForHR' неправильно. 'GetLastWin32Error' не возвращает HRESULT. Используйте просто 'throw new Win32Exception();'. – IllidanS4
Не доступен ли буфер обмена из .net? http://stackoverflow.com/a/899361/1808494 – Aron
Спасибо @ illidans4. Я исправил свой вопрос. Я также добавил более подробную информацию о том, что происходит. –