PRB: Метафайлы в буфере обмена не отображаются для всех приложений

Переводы статьи Переводы статьи
Код статьи: 323530 - Vizualiza?i produsele pentru care se aplic? acest articol.
В данной статье относится к следующим Microsoft.NET Пространства имен библиотеки классов Framework:
  • System.Drawing.Imaging
  • Класса System.Runtime.InteropServices
Развернуть все | Свернуть все

Проблема

Метафайлы.NET приложения добавить в буфер обмена, не видимым для других приложений.

Причина

Эта проблема возникает, если.NET Framework использует новый Формат буфера обмена, когда он добавляет метафайлы в буфер обмена. Другие приложения Например, Microsoft Word или операционной системы не поддерживают это новое форматирование и, таким образом, невозможно вставить или отобразить изображение.

Решение

Добавление метафайл в буфер обмена, таким образом, чтобы видеть их другие приложения, необходимо использовать формат CF_ENHMETAFILE. Поддержка этой Формат осуществляется с помощью DataObject класс с DataFormats.EnhancedMetafile метод. К сожалению ограничения в текущей реализации о.NET Framework запретить это приемлемым решением. Таким образом вы необходимо получить взаимодействие с Win32 Буфер обмена прикладного программирования (API) для решения этой проблемы проблема.

Образцы кода, которые следуют за иллюстрируется Добавление метафайл в буфер обмена, так что он является видимым для других приложений.

Microsoft Visual Basic.NET-пример

Imports System.Drawing.Imaging
Imports System.Runtime.InteropServices

Public Class ClipboardMetafileHelper
    <DllImport("user32.dll", EntryPoint:="OpenClipboard", _
       SetLastError:=True, ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> _
    Public Shared Function OpenClipboard(ByVal hWnd As IntPtr) As Boolean
    End Function
    <DllImport("user32.dll", EntryPoint:="EmptyClipboard", _
       SetLastError:=True, ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> _
    Public Shared Function EmptyClipboard() As Boolean
    End Function
    <DllImport("user32.dll", EntryPoint:="SetClipboardData", _
       SetLastError:=True, ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> _
    Public Shared Function SetClipboardData(ByVal uFormat As Integer, ByVal hWnd As IntPtr) As IntPtr
    End Function
    <DllImport("user32.dll", EntryPoint:="CloseClipboard", _
       SetLastError:=True, ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> _
    Public Shared Function CloseClipboard() As Boolean
    End Function
    <DllImport("gdi32.dll", EntryPoint:="CopyEnhMetaFileA", _
       SetLastError:=True, ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> _
    Public Shared Function CopyEnhMetaFile(ByVal hemfSrc As IntPtr, ByVal hNULL As IntPtr) As IntPtr
    End Function
    <DllImport("gdi32.dll", EntryPoint:="DeleteEnhMetaFile", _
       SetLastError:=True, ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> _
    Public Shared Function DeleteEnhMetaFile(ByVal hemfSrc As IntPtr) As Boolean
    End Function

    ' Metafile mf is set to a state that is not valid inside this function.
    Public Shared Function PutEnhMetafileOnClipboard(ByVal hWnd As IntPtr, ByVal mf As Metafile) As Boolean
        Dim bResult As New Boolean()
        bResult = False
        Dim hEMF, hEMF2 As IntPtr
        hEMF = mf.GetHenhmetafile() ' invalidates mf
        If Not hEMF.Equals(New IntPtr(0)) Then
            hEMF2 = CopyEnhMetaFile(hEMF, New IntPtr(0))
            If Not hEMF2.Equals(New IntPtr(0)) Then
                If OpenClipboard(hWnd) Then
                    If EmptyClipboard() Then
                        Dim hRes As IntPtr
                        hRes = SetClipboardData(14, hEMF2)    ' 14 == CF_ENHMETAFILE
                        bResult = hRes.Equals(hEMF2)
                        CloseClipboard()
                    End If
                End If
            End If
            DeleteEnhMetaFile(hEMF)
        End If
        Return bResult
    End Function

End Class


'You can call this function with code that is similar to the following code:
        Dim mf As New Metafile("filename.emf")
        ClipboardMetafileHelper.PutEnhMetafileOnClipboard(me.Handle,mf)
				

Microsoft Visual C#.NET-пример

using System.Drawing.Imaging;
using System.Runtime.InteropServices;

public class ClipboardMetafileHelper
{
	[DllImport("user32.dll")]
	static extern bool OpenClipboard(IntPtr hWndNewOwner);
	[DllImport("user32.dll")]
	static extern bool EmptyClipboard();
	[DllImport("user32.dll")]
	static extern IntPtr SetClipboardData(uint uFormat, IntPtr hMem);
	[DllImport("user32.dll")]
	static extern bool CloseClipboard();
	[DllImport("gdi32.dll")]
	static extern IntPtr CopyEnhMetaFile(IntPtr hemfSrc, IntPtr hNULL);
	[DllImport("gdi32.dll")]
	static extern bool DeleteEnhMetaFile(IntPtr hemf);
	
	// Metafile mf is set to a state that is not valid inside this function.
	static public bool PutEnhMetafileOnClipboard( IntPtr hWnd, Metafile mf )
	{
		bool bResult = false;
		IntPtr hEMF, hEMF2;
		hEMF = mf.GetHenhmetafile(); // invalidates mf
		if( ! hEMF.Equals( new IntPtr(0) ) )
		{
			hEMF2 = CopyEnhMetaFile( hEMF, new IntPtr(0) );
			if( ! hEMF2.Equals( new IntPtr(0) ) )
			{
				if( OpenClipboard( hWnd ) )
				{
					if( EmptyClipboard() )
					{
						IntPtr hRes = SetClipboardData( 14 /*CF_ENHMETAFILE*/, hEMF2 );
						bResult = hRes.Equals( hEMF2 );
						CloseClipboard();
					}
				}
			}
			DeleteEnhMetaFile( hEMF );
		}
		return bResult;
	}
}

//You can call this function with code that is similar to the following code:
Metafile mf = new Metafile( "filename.emf" );
ClipboardMetafileHelper.PutEnhMetafileOnClipboard(this.Handle, mf );
				

Свойства

Код статьи: 323530 - Последний отзыв: 8 июня 2011 г. - Revision: 4.0
Информация в данной статье относится к следующим продуктам.
  • Microsoft Windows XP Professional
Ключевые слова: 
kbdswgdi2003swept kbprb kbmt KB323530 KbMtru
Переведено с помощью машинного перевода
ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.
Эта статья на английском языке:323530

Отправить отзыв

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com