Choisir votre approche d’interopérabilité pour les applications Windows

Windows applications de bureau (WinUI 3, WPF, WinForms, console) doivent parfois appeler des API en dehors de leur framework managé. Cette page vous aide à comprendre quand cela se produit et à choisir la bonne technique.

Deux surfaces d’API, deux modèles d’interopérabilité

Windows expose les fonctionnalités via deux surfaces d’API principales :

  • API Win32 : les fonctions de style C classiques exportées à partir de DLL système (user32.dll, , kernel32.dllshell32.dll, etc.). Celles-ci couvrent les opérations de bas niveau telles que la gestion des fenêtres, les E/S de fichiers, le contrôle de processus et l’accès matériel. Elles existent depuis les versions les plus anciennes de Windows et restent le moyen d'accéder à de nombreuses fonctionnalités du système d'exploitation qui n'ont pas d'équivalent managé.

  • API Windows Runtime (WinRT) : surface d’API moderne orientée objet (espaces de noms commençant par Windows.*) introduite avec Windows 8. Les API WinRT couvrent des domaines tels que les notifications, la capture multimédia, Bluetooth, la géolocalisation, etc. La plupart des API WinRT sont directement accessibles à partir de .NET sans effort spécial, mais certaines ont des restrictions dans les applications de bureau ou nécessitent un handle de fenêtre (HWND) pour fonctionner.

Quand vous serez confronté à l’interop

Vous avez généralement besoin d’interopérabilité lorsque votre infrastructure d’application n’expose pas directement une fonctionnalité de système d’exploitation particulière. Les scénarios courants sont les suivants :

Scénario Quelle surface d’API Example
Personnaliser le positionnement de la barre de titre ou de la fenêtre Win32 SetWindowPos, DwmExtendFrameIntoClientArea
Définir une fenêtre en tant que « toujours en haut » ou contrôler l’ordre Z Win32 SetWindowPos avec HWND_TOPMOST
Afficher un sélecteur de fichiers ou partager une boîte de dialogue à partir de WinUI 3 WinRT (nécessite HWND) FileOpenPicker avec InitializeWithWindow
Lire la mémoire système ou les compteurs de performances Win32 GlobalMemoryStatusEx, QueryPerformanceCounter
Définir un raccourci clavier global Win32 RegisterHotKey
Envoyer une notification toast (application non empaquetée) WinRT (avec le Kit de développement logiciel (SDK) d’application AppNotificationManager

Dans tous ces cas, vous écrivez du code C# normal, mais appelez dans Windows via une couche d’interopérabilité. Les rubriques ci-dessous vous guident dans chaque approche.

Guide de décision

J’ai besoin de... Approche recommandée Sujet
Appeler une API Win32 (utilisateur32, noyau32, shell32, etc.) à partir de C# Utiliser le générateur source CsWin32 — type-safe, aucune signature écrite manuellement Appeler des API Win32 à partir de C# (CsWin32)
Initialiser un objet WinRT avec un handle de fenêtre (sélecteurs, boîtes de dialogue, interface utilisateur de partage) Utilisez les classes d’interopérabilité COM .NET WinRT (InitializeWithWindow, WindowNativeetc.) Appeler les API d'interopérabilité depuis une application .NET
Vérifier si une API WinRT fonctionne dans une application de bureau (non UWP) Consulter la liste des restrictions et alternatives Les API WinRT non prises en charge dans les applications de bureau
Voir un exemple WinUI 3 complet qui personnalise une fenêtre à l’aide d’appels Win32 Suivez la procédure pas à pas de bout en bout Procédure pas à pas : application WinUI 3 avec interopérabilité Win32

Organigramme rapide

  1. L’API se trouve-t-elle dans un Windows.* espace de noms WinRT ?

  2. Est-ce qu’il s’agit d’une API Win32/native (définie dans un en-tête du KIT de développement logiciel (SDK) Windows) ?