Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
As aplicações de ambiente de trabalho do Windows (WinUI 3, WPF, WinForms, consola) por vezes precisam de chamar APIs fora do seu framework gerido. Esta página ajuda-o a perceber quando isso acontece e a escolher a técnica certa.
Duas superfícies API, dois padrões de interoperabilidade
O Windows expõe funcionalidades através de duas superfícies principais de API:
APIs Win32 — As funções clássicas ao estilo C exportadas a partir de DLLs do sistema (
user32.dll,kernel32.dll,shell32.dll, etc.). Estes abrangem operações de baixo nível como gestão de janelas, I/O de ficheiros, controlo de processos e acesso a hardware. Existem desde as primeiras versões do Windows e continuam a ser a forma de aceder a muitas funcionalidades do sistema operativo que não têm equivalente gerido.APIs do Windows Runtime (WinRT) — Uma superfície moderna orientada a objetos (espaços de nomes começando por
Windows.*) introduzida com o Windows 8. As APIs WinRT abrangem áreas como notificações, captura de media, Bluetooth, geolocalização e muito mais. A maioria das APIs do WinRT é acessível diretamente a partir do .NET sem esforço especial, mas algumas têm restrições em aplicações de ambiente de trabalho ou requerem um handle de janela (HWND) para funcionar.
Quando vais encontrar interoperabilidade
Normalmente precisas de interoperabilidade quando o framework da tua aplicação não expõe diretamente uma funcionalidade específica do sistema operativo. Cenários comuns incluem:
| Scenario | Qual superfície da API | Example |
|---|---|---|
| Personalize a colocação da barra de título ou da janela | Win32 |
SetWindowPos, DwmExtendFrameIntoClientArea |
| Defina uma janela como "sempre em cima" ou controle a ordem Z | Win32 |
SetWindowPos com HWND_TOPMOST |
| Mostrar um seletor de ficheiros ou um diálogo de partilha do WinUI 3 | WinRT (precisa de HWND) |
FileOpenPicker com InitializeWithWindow |
| Leia memória do sistema ou contadores de desempenho | Win32 |
GlobalMemoryStatusEx, QueryPerformanceCounter |
| Registar um atalho de teclado global | Win32 | RegisterHotKey |
| Envie uma notificação de toast (aplicação desempacotada) | WinRT (com o App SDK) | AppNotificationManager |
Em todos estes casos, escreves código normal em C# mas ligas ao Windows através de uma camada de interoperabilidade. Os temas abaixo guiam-no em cada abordagem.
Guia de decisão
| Preciso de... | Abordagem recomendada | Topic |
|---|---|---|
| Chamar uma API Win32 (user32, kernel32, shell32, etc.) a partir do C# | Utilize o gerador de código CsWin32 — com segurança de tipos, sem assinaturas escritas manualmente | Chamar APIs Win32 a partir de C# (CsWin32) |
| Inicializar um objeto WinRT com um handle de janela (selectores, diálogos, interface de partilha) | Use as classes de interoperabilidade .NET WinRT COM (InitializeWithWindow, WindowNative, etc.) |
Chamar APIs de interoperação numa aplicação .NET |
| Verifique se uma API WinRT funciona numa aplicação desktop (não UWP) | Consulte a lista de restrições e alternativas | APIs WinRT não suportadas em aplicações de ambiente de trabalho |
| Veja um exemplo completo do WinUI 3 que personaliza uma janela usando chamadas Win32 | Siga o tutorial do início ao fim | Tutorial: aplicação WinUI 3 com interoperabilidade com Win32 |
Fluxograma rápido
A API está num
Windows.*espaço de nomes WinRT?- Sim → Consulte as APIs WinRT não suportadas em aplicações de ambiente de trabalho para conhecer as restrições. Se a API exigir um identificador de janela, consulte Invocar APIs de interoperabilidade a partir de uma aplicação .NET.
- Sem → Continuar para o passo 2.
É uma API Win32/nativa (definida num cabeçalho do SDK do Windows)?
- Sim, → usar o CsWin32 para gerar associações P/Invoke seguras para tipos.
- Não → Pode tratar-se de uma interface COM ou de uma biblioteca nativa de terceiros. Consulte a interoperabilidade do .NET com código nativo para orientações gerais sobre P/Invoke.
Tópicos relacionados
- Chamar APIs Win32 a partir de C# (CsWin32)
- Chamar APIs de interoperação numa aplicação .NET
- APIs WinRT não suportadas em aplicações de ambiente de trabalho
- Tutorial: aplicação WinUI 3 com interoperabilidade com Win32
- Recuperar um identificador de janela (HWND)
- Interoperabilidade do .NET com código nativo
Windows developer