Выбор подхода взаимодействия для приложений Windows

Классическим приложениям Windows (WinUI 3, WPF, WinForms, консольным приложениям) иногда требуется вызывать API за пределами своей управляемой платформы. Эта страница поможет вам понять, когда это происходит, и выбрать правильный способ.

Две поверхности API, два шаблона взаимодействия

Windows предоставляет функциональные возможности с помощью двух основных поверхностей API:

  • API Win32 — классические функции в стиле языка C, экспортируемые системными DLL (user32.dll, kernel32.dll и shell32.dll, т. д.). Эти операции охватывают низкоуровневые операции, такие как управление окнами, операции ввода-вывода, управление процессами и доступ к оборудованию. Они существуют с самых ранних версий Windows и остаются способом доступа ко многим функциям ОС, которые не имеют управляемого эквивалента.

  • API среда выполнения Windows (WinRT) — современная объектно-ориентированная область API (пространства имен, начиная сWindows.*) представленная с Windows 8. API WinRT охватывают такие области, как уведомления, захват мультимедиа, Bluetooth, геолокация и многое другое. Большинство API WinRT доступны непосредственно из .NET без особых усилий, но некоторые из них имеют ограничения в настольных приложениях или требуют дескриптор окна (HWND) для своей работы.

Когда вы столкнетесь с взаимодействием

Обычно требуется взаимодействие, если платформа приложений не предоставляет определенную возможность ОС напрямую. Ниже приведены распространенные сценарии.

Сценарий Какая поверхность API Example
Настройка строки заголовка или размещения окна Win32 SetWindowPos, DwmExtendFrameIntoClientArea
Установка окна как "всегда сверху" или управление Z-порядком Win32 SetWindowPos С HWND_TOPMOST
Отображение диалогового окна выбора файлов или общего доступа из WinUI 3 WinRT (требуется HWND) FileOpenPicker С InitializeWithWindow
Чтение системной памяти или счетчиков производительности Win32 GlobalMemoryStatusEx, QueryPerformanceCounter
Регистрация глобального горячего ключа Win32 RegisterHotKey
Отправить всплывающее уведомление (неупакованное приложение) WinRT (с пакетом SDK для приложений) AppNotificationManager

Во всех этих случаях вы пишете обычный код C#, но вызываете Windows через слой взаимодействия. В следующих разделах описано, как использовать каждый подход.

Рекомендации по принятию решений

Мне нужно... Рекомендуемый подход Topic
Вызов API Win32 (user32, kernel32, shell32 и т. д.) из C# Используйте генератор исходного кода CsWin32 — с типобезопасными сигнатурами без необходимости писать их вручную Вызов API Win32 из C# (CsWin32)
Инициализация объекта WinRT с помощью дескриптора окна (средства выбора, диалоги, общий пользовательский интерфейс) Используйте классы взаимодействия WINRT COM .NET (InitializeWithWindow, WindowNativeи т. д.) Вызов API взаимодействия из приложения .NET
Проверьте, работает ли API WinRT в классическом приложении (не UWP) Ознакомьтесь с ограничениями и альтернативными вариантами API WinRT не поддерживаются в классических приложениях
Полный пример WinUI 3 , который настраивает окно с помощью вызовов Win32 Следуйте пошаговому руководству от начала до конца Пошаговое руководство: приложение WinUI 3 с взаимодействием с Win32

Быстрая блок-схема

  1. API находится в пространстве имен Windows.* WinRT?

  2. Это Win32/нативный API (определённый в заголовочном файле Windows SDK)?

    • Да → используйте CsWin32 для создания типобезопасных обвязок P/Invoke.
    • Нет → это может быть COM-интерфейсом или сторонней нативной библиотекой. См. взаимодействие .NET с неуправляемым кодом для получения общих рекомендаций по P/Invoke.