PROBLEMA: Metarquivos na área de transferência não estão visíveis para todos os aplicativos

O suporte para o Windows XP terminou

A Microsoft terminou o suporte para o Windows XP em 8 de abril de 2014. Esta alteração afetou as suas atualizações de software e opções de segurança. Saiba o que isto significa para você e como permanecer protegido.

IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.

Clique aqui para ver a versão em Inglês deste artigo: 323530
Este artigo foi arquivado. É oferecido "como está" e não será mais atualizado.
Este artigo se refere à seguintes Microsoft .NET Framework Class Library namespaces:
  • System.Drawing.Imaging
  • System.Runtime.InteropServices
Sintomas
Metarquivos aplicativos .NET adicionam à área de transferência não são visíveis para outros aplicativos.
Causa
Esse problema ocorre porque o .NET Framework usa um novo formato de área de transferência quando ele adiciona metarquivos para a área de transferência. Outros aplicativos, como o Microsoft Word ou o sistema operacional não estão cientes desse novo formato e, portanto, não é possível colar ou exibir a imagem.
Resolução
Para adicionar um metarquivo a área de transferência para que fique visível para outros aplicativos, você deve usar o formato CF_ENHMETAFILE. O suporte para esse formato é fornecido através da classe de DataObject com o método DataFormats.EnhancedMetafile . Infelizmente, limitações na implementação atual do .NET Framework impedir isso de uma solução viável. Portanto, você deve obter interoperabilidade com Win32 área de transferência interfaces de programação de aplicativo (APIs) para resolver esse problema.

As amostras de código que seguem demonstram como adicionar um metarquivo para a área de transferência para que fique visível para outros aplicativos.

Exemplo do Microsoft Visual Basic .NET

Imports System.Drawing.ImagingImports System.Runtime.InteropServicesPublic 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 FunctionEnd 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)				

Exemplo do Microsoft Visual translation from VPE for Csharp .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 );				
não está disponível não pode acessar consulte não disponíveis aprimorada emf wmf

Aviso: este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 323530 - Última Revisão: 12/07/2015 11:17:02 - Revisão: 3.2

Microsoft .NET Framework Software Development Kit 1.0 Service Pack 2, Microsoft .NET Framework Software Development Kit 1.0 Service Pack 2, Microsoft Windows XP Professional, the operating system: Microsoft Windows XP 64-Bit Edition

  • kbnosurvey kbarchive kbmt kbdswgdi2003swept kbprb KB323530 KbMtpt
Comentários