Partilhar via


Visão geral de Windows Forms e aplicativos não gerenciados

Os aplicativos e controles do Windows Forms podem interoperar com aplicativos não gerenciados, com algumas ressalvas. As seções a seguir descrevem os cenários e configurações que os aplicativos e controles do Windows Forms suportam e aqueles que eles não suportam.

Controles do Windows Forms e aplicativos ActiveX

Com exceção do Microsoft Internet Explorer e Microsoft Foundation Classes (MFC), os controles Windows Forms não são suportados em aplicativos projetados para hospedar controles ActiveX. Outros aplicativos e ferramentas de desenvolvimento que são capazes de hospedar controles ActiveX, incluindo os contêineres de teste ActiveX de versões do Visual Studio anteriores ao Visual Studio .NET 2003, não são hosts suportados para controles Windows Forms.

Essas restrições também se aplicam ao uso de controles Windows Forms por meio da interoperabilidade COM do modelo de objeto componente. O uso de um controlo Windows Forms por meio de um wrapper de invocação COM (CCW) só é suportado no Internet Explorer. Para obter mais informações sobre interoperabilidade COM, consulte

Interoperabilidade COM.

A tabela a seguir mostra o suporte de hospedagem ActiveX disponível para controles do Windows Forms.

Versão do Windows Forms Suporte
.NET Framework versão 1.0 Internet Explorer 5.01 e versões posteriores
.NET Framework versão 1.1 e posterior Internet Explorer 5.01 e versões posteriores

Microsoft Foundation Classes (MFC) 7.0 e posterior

Hospedando componentes do Windows Forms como controles ActiveX

No .NET Framework 1.1, o suporte foi estendido para incluir MFC 7.0 e versões posteriores. Esse suporte inclui qualquer contêiner que seja totalmente compatível com o MFC 7.0 e contêiner de controle ActiveX posterior.

No entanto, o registro de controles Windows Forms como controles ActiveX não é suportado. Além disso, não há suporte para chamar o método com.ms.win32.Ole32.CoCreateInstance para controles do Windows Forms. Somente a ativação gerenciada de controles Windows Forms é suportada. Depois de criar um controle Windows Forms, você pode hospedá-lo em um aplicativo MFC assim como com um controle ActiveX.

Para usar controles Windows Forms em seu aplicativo não gerenciado, você deve hospedar o CLR usando as APIs de hospedagem CLR não gerenciadas ou usar os recursos de interoperabilidade C++. Usar os recursos de interoperabilidade C++ é a solução recomendada.

Windows Forms em aplicativos cliente COM

Quando você abre um Windows Form de um aplicativo cliente COM, como um aplicativo Visual Basic 6.0 ou um aplicativo MFC, o formulário pode se comportar inesperadamente. Por exemplo, quando você pressiona a tecla TAB, o foco não muda de um controle para outro. Quando você pressiona a tecla ENTER enquanto um botão de comando tem foco, o evento Click do botão não é gerado. Você também pode experimentar um comportamento inesperado ao pressionar teclas ou usando o rato.

Esse comportamento ocorre porque o aplicativo não gerenciado não implementa o suporte de loop de mensagem que o Windows Forms requer para funcionar corretamente. O loop de mensagem fornecido pelo aplicativo cliente COM é fundamentalmente diferente do loop de mensagem do Windows Forms.

O loop de mensagens de um aplicativo é um loop de programa interno que recupera mensagens da fila de mensagens de um thread, as traduz e as envia para o aplicativo a ser manipulado. O loop de mensagem para um Windows Form não tem a mesma arquitetura que os loops de mensagem que os aplicativos anteriores, como aplicativos Visual Basic 6.0 e aplicativos MFC, fornecem. As mensagens de janela que são postadas no loop de mensagens podem ser tratadas de forma diferente do que o Windows Form espera. Portanto, um comportamento inesperado pode ocorrer. Algumas combinações de pressionamento de tecla podem não funcionar, alguma atividade do mouse pode não funcionar ou alguns eventos podem não ser gerados conforme o esperado.

Resolução de problemas de interoperabilidade

Você pode resolver esses problemas exibindo o formulário em um loop de mensagem do .NET Framework, que é criado usando o método Application.Run.

Para fazer um Windows Form funcionar corretamente a partir de um aplicativo cliente COM, você deve executá-lo em um loop de mensagem do Windows Forms. Para fazer isso, use uma das seguintes abordagens:

Ver também