Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Классическим приложениям 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 |
Быстрая блок-схема
API находится в пространстве имен
Windows.*WinRT?- Да → Проверьте API WinRT, не поддерживаемые в классических приложениях, чтобы узнать об ограничениях. Если API требуется дескриптор окна, ознакомьтесь с разделом Вызов API взаимодействия из приложения .NET.
- Нет → продолжить шаг 2.
Это Win32/нативный API (определённый в заголовочном файле Windows SDK)?
- Да → используйте CsWin32 для создания типобезопасных обвязок P/Invoke.
- Нет → это может быть COM-интерфейсом или сторонней нативной библиотекой. См. взаимодействие .NET с неуправляемым кодом для получения общих рекомендаций по P/Invoke.
Связанные темы
Windows developer