Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Windows aplicativos da área de trabalho (WinUI 3, WPF, WinForms, console) às vezes precisam chamar APIs fora de sua estrutura gerenciada. Esta página ajuda você a entender quando isso acontece e escolher a técnica certa.
Duas superfícies de API, dois padrões de interoperabilidade
Windows expõe a funcionalidade por meio de duas superfícies de API principais:
APIs win32 — as funções clássicas no estilo C exportadas de DLLs do sistema (
user32.dll, ,kernel32.dlletcshell32.dll.). Elas abrangem operações de baixo nível, como gerenciamento de janelas, E/S de arquivo, controle de processo e acesso de hardware. Eles existem desde as primeiras versões do Windows e continuam sendo a maneira de acessar muitos recursos do sistema operacional que não têm equivalente gerenciado.APIs do Windows Runtime (WinRT) — uma superfície de API moderna orientada a objetos (namespaces começando com
Windows.*) introduzida com Windows 8. As APIs do WinRT abrangem áreas como notificações, captura de mídia, Bluetooth, localização geográfica e muito mais. A maioria das APIs do WinRT pode ser acessada diretamente do .NET sem esforço especial, mas algumas têm restrições em aplicativos para desktop ou exigem um identificador de janela (HWND) para funcionar.
Quando você encontrará interoperabilidade
Normalmente, você precisa de interoperabilidade quando a estrutura do aplicativo não expõe diretamente uma funcionalidade específica do sistema operacional. Cenários comuns incluem:
| Scenario | Qual superfície de API | Example |
|---|---|---|
| Personalizar a barra de título ou o posicionamento da janela | Win32 |
SetWindowPos, DwmExtendFrameIntoClientArea |
| Definir uma janela como "sempre na parte superior" ou controlar a ordem Z | Win32 |
SetWindowPos com HWND_TOPMOST |
| Mostrar um seletor de arquivo ou uma caixa de diálogo de compartilhamento do WinUI 3 | WinRT (precisa de HWND) |
FileOpenPicker com InitializeWithWindow |
| Ler a memória do sistema ou os contadores de desempenho | Win32 |
GlobalMemoryStatusEx, QueryPerformanceCounter |
| Registrar uma chave de acesso global | Win32 | RegisterHotKey |
| Enviar uma notificação do sistema (aplicativo não empacotado) | WinRT (com o SDK do Aplicativo) | AppNotificationManager |
Em todos esses casos, você escreve código C# normal, mas chama Windows por meio de uma camada de interoperabilidade. Os tópicos a seguir orientam você por cada abordagem.
Guia de decisão
| Eu preciso... | Abordagem recomendada | Tópico |
|---|---|---|
| Chamar uma API Win32 (user32, kernel32, shell32, etc.) a partir de C# | Use o gerador de código-fonte CsWin32 — seguro em termos de tipo, sem assinaturas escritas manualmente | Invocar APIs Win32 a partir de C# (CsWin32) |
| Inicializar um objeto WinRT com um identificador de janela (seletores, caixas de diálogo, compartilhar interface do usuário) | Use as classes de interoperabilidade COM do WinRT do .NET (InitializeWithWindow, WindowNative, etc.) |
Chamar APIs de interoperabilidade de um aplicativo .NET |
| Verificar se uma API do WinRT funciona em um aplicativo da área de trabalho (não UWP) | Consulte a lista de restrições e alternativas | APIs do WinRT não compatíveis com aplicativos de desktop |
| Veja um exemplo completo do WinUI 3 que personaliza uma janela usando chamadas do Win32 | Siga o guia completo | Passo a passo: aplicativo WinUI 3 com interoperabilidade do Win32 |
Fluxograma rápido
A API está em um
Windows.*namespace do WinRT?- Sim → Verifique APIs do WinRT sem suporte em aplicativos da área de trabalho para conhecer as restrições. Se a API exigir um manipulador de janela, consulte Chamar APIs de interoperabilidade de um aplicativo .NET.
- Não → Continue para a etapa 2.
É uma API win32/nativa (definida em um cabeçalho do SDK Windows)?
- Sim, → use CsWin32 para gerar associações P/Invoke com segurança de tipo.
- Não → Pode ser uma interface COM ou uma biblioteca nativa de terceiros. Consulte .NET: interoperabilidade com código nativo para obter orientações gerais sobre P/Invoke.
Tópicos relacionados:
- Invocar APIs Win32 a partir de C# (CsWin32)
- Chamar APIs de interoperabilidade de um aplicativo .NET
- APIs do WinRT não compatíveis com aplicativos de desktop
- Passo a passo: aplicativo WinUI 3 com interoperabilidade do Win32
- Recuperar um identificador de janela (HWND)
- Interoperabilidade do .NET com código nativo
Windows developer