Вызов API взаимодействия из приложения .NET
Как разработчик настольных приложений на C# в .NET, вы можете использовать классы взаимодействия C#, которые представляют несколько функций взаимодействия и интерфейсов COM-взаимодействия с Windows Runtime (WinRT). К ним относятся классы C#, представляющие IWindowNative, IInitializeWithWindow, функцию GetWindowIdFromWindow и многие другие.
В этом разделе перечислены доступные классы взаимодействия C# и показано, как их использовать. В разделе Фон в конце темы описывается, как интерфейсы взаимодействия использовались в предыдущих версиях .NET и почему было внесено изменение.
Настройка классического проекта .NET для использования классов взаимодействия C#
Классы взаимодействия C#, перечисленные в следующем разделе (доступные классы взаимодействия C#) доступны в .NET как часть пакета SDK для приложений Windowsили с помощью определенной Целевой платформы Moniker, как мы увидим.
В настольном проекте WinUI 3 на C#
При создании нового проекта WinUI 3 в Visual Studio (см. создание первого проекта WinUI 3), проект уже настроен, и вы можете сразу же начать использовать все классы взаимодействия C#.
В других типах настольных проектов C# (WPF или WinForms)
Для других типов классических проектов .NET, таких как Windows Presentation Foundation (WPF) или Windows Forms (WinForms), необходимо настроить проект, прежде чем получить доступ к классам взаимодействия C#. Для первого набора классов, перечисленных ниже, необходимо ссылаться на пакет SDK для приложений Windows. Для второго набора необходимо настроить Target Framework Moniker, предназначенный для Windows 10 версии 1809 или новее, как показано ниже.
Откройте файл проекта для настольного приложения C# .NET.
В файле
.csproj
измените элемент TargetFramework для конкретной версии пакета SDK для .NET и Windows. Например, следующий элемент подходит для проекта .NET 6, предназначенного для Windows 10 версии 2004.<PropertyGroup> <TargetFramework>net8.0-windows10.0.19041.0</TargetFramework> </PropertyGroup>
Дополнительные сведения, включая список других поддерживаемых значений, см. в разделе Использование параметра Moniker целевой платформы.
Доступные классы взаимодействия C#
Заметка
Для приведенных ниже классов требуется пакет SDK для .NET 6 или более поздней версии.
Ниже приведены доступные классы взаимодействия C#, сопоставленные с базовой функцией взаимодействия или интерфейсом COM-взаимодействия WinRT. Каждый класс, перечисленный в списке, реализует функции и методы своего базового API взаимодействия и предоставляет типобезопасные оболочки для параметров и возвращаемых значений. Например, для метода Windows.ApplicationModel.DataTransfer.DragDrop.Core.DragDropManagerInterop.GetForWindow необходим параметр - дескриптор окна IntPtr (HWND), и он возвращает объект CoreDragDropManager. Все классы взаимодействия C# ниже и связанные с ними методы являются статическими.
Доступно в составе пакета SDK для приложений Windows
Класс Microsoft.UI.Win32Interop реализует методы взаимодействия C# в таблице ниже. Пример кода см. в разделе Управление окнами приложений.
Функция взаимодействия | Метод взаимодействия C# |
---|---|
GetDisplayIdFromMonitor | (Microsoft.UI) DisplayId Win32Interop.GetDisplayIdFromMonitor(IntPtr hmonitor) |
GetIconFromIconId | (Microsoft.UI) IntPtr Win32Interop.GetIconFromIconId(IconId iconId) |
GetIconIdFromIcon | (Microsoft.UI) IconId Win32Interop.GetIconIdFromIcon(IntPtr hicon) |
GetMonitorFromDisplayId | (Microsoft.UI) IntPtr Win32Interop.GetMonitorFromDisplayId(DisplayId displayId) |
GetWindowFromWindowId | (Microsoft.UI) IntPtr Win32Interop.GetWindowFromWindowId(WindowId windowId) |
GetWindowIdFromWindow | (Microsoft.UI) WindowId Win32Interop.GetWindowIdFromWindow(IntPtr hwnd) |
Доступно с помощью Target Framework Moniker
Интерфейс взаимодействия WINRT COM | Класс взаимодействия C# |
---|---|
IAccountsSettingsPaneInterop | (Windows.UI.ApplicationSettings) AccountsSettingsPaneInterop |
IDisplayInformationStaticsInterop | Представлено в TFM net6.0-windows10.0.22621.0 и .NET 6.0.7.(Windows.Graphics.Display) DisplayInformationInterop |
IDragDropManagerInterop | (Windows.ApplicationModel.DataTransfer.DragDrop.Core) DragDropManagerInterop |
IInitializeWithWindow | (WinRT.Interop) InitializeWithWindow |
IInputPaneInterop | (Windows.UI.ViewManagement) InputPaneInterop |
IPlayToManagerInterop | (Windows.Media.PlayTo) PlayToManagerInterop |
IPrintManagerInterop | (Windows.Graphics.Printing) PrintManagerInterop |
IRadialControllerConfigurationInterop | (Windows.UI.Input) RadialControllerConfigurationInterop |
IRadialControllerIndependentInputSourceInterop | (Windows.UI.Input.Core) RadialControllerIndependentInputSourceInterop |
IRadialControllerInterop | (Windows.UI.Input) RadialControllerInterop |
ISpatialInteractionManagerInterop | (Windows.UI.Input.Spatial) SpatialInteractionManagerInterop |
ISystemMediaTransportControlsInterop | (Windows.Media) SystemMediaTransportControlsInterop |
IUIViewSettingsInterop | (Windows.UI.ViewManagement) UIViewSettingsInterop |
IUserConsentVerifierInterop | (Windows.Security.Credentials.UI) UserConsentVerifierInterop |
IWebAuthenticationCoreManagerInterop | (Windows.Security.Authentication.Web.Core) WebAuthenticationCoreManagerInterop |
IWindowNative | Только WinUI 3 (WinRT.Interop) WindowNative Альтернативные варианты для WPF и WinForms см. в разделе Получение дескриптора окна (HWND). |
Пример кода
В этом примере кода показано, как использовать два класса взаимодействия C# в приложении WinUI 3 (см. создание первого проекта WinUI 3). Пример сценария — отображение Windows.Storage.Pickers.FolderPicker. Но перед отображением средства выбора в классическом приложении необходимо инициализировать его с помощью дескриптора (HWND) окна владельца.
- Вы можете получить дескриптор окна (HWND) с помощью интерфейса взаимодействия IWindowNative WinRT COM. Глядя на таблицу из предыдущего раздела, видно, что интерфейс представлен классом взаимодействия WinRT.Interop.WindowNative C#. Здесь объект
this
является ссылкой на объект Microsoft.UI.Xaml.Window из файла главного кода окна. - Чтобы инициализировать часть пользовательского интерфейса с окном владельца, используйте интерфейс взаимодействия IInitializeWithWindow WinRT COM. И этот интерфейс представлен классом взаимодействия WinRT.Interop.InitializeWithWindow C#.
private async void myButton_Click(object sender, RoutedEventArgs e)
{
// Create a folder picker.
var folderPicker = new Windows.Storage.Pickers.FolderPicker();
// 1. Retrieve the window handle (HWND) of the current WinUI 3 window.
var hWnd = WinRT.Interop.WindowNative.GetWindowHandle(this);
// 2. Initialize the folder picker with the window handle (HWND).
WinRT.Interop.InitializeWithWindow.Initialize(folderPicker, hWnd);
// Use the folder picker as usual.
folderPicker.FileTypeFilter.Add("*");
var folder = await folderPicker.PickSingleFolderAsync();
}
См. также Получение дескриптора окна (HWND) и Отображение объектов пользовательского интерфейса WinRT, зависящих от CoreWindow.
Фон
Предыдущие версии .NET Framework и .NET Core имели встроенные знания о WinRT. С помощью этих предыдущих версий можно определить интерфейс взаимодействия непосредственно в C# с помощью атрибута comImport ComImport, а затем напрямую привести проецируемый класс к интерфейсу взаимодействия.
Поскольку WinRT — это технология, специфическая для Windows, для обеспечения переносимости и повышения эффективности .NET мы вынесли поддержку проекции WinRT из компилятора C# и среды выполнения .NET и переместили её в набор инструментов C#/WinRT (см. встроенная поддержка WinRT удаляется из .NET).
Хотя метод ComImport все еще работает для интерфейсов на основе IUnknown, он уже не действует для интерфейсов на основе IInspectable, используемых для взаимодействия с WinRT.
Таким образом, в .NET можно использовать классы взаимодействия C#, описанные в этом разделе.
Устранение неполадок и известных проблем
В настоящее время нет известных проблем для классов взаимодействия C#. Чтобы предоставить отзыв или сообщить о других проблемах, добавьте отзыв в существующую проблему или отправьте новую проблему в репозитории WindowsAppSDK GitHub .
Связанные разделы
Windows developer