Поддержка API среда выполнения Windows в настольных приложениях

Хотя в настольном приложении C# или C++ можно использовать большинство API среда выполнения Windows (см. среда выполнения Windows (WinRT) namespaces), существуют два основных набора API WinRT, которые не поддерживаются в настольных приложениях или имеют ограничения:

  • API с зависимостями от функций пользовательского интерфейса, предназначенных для использования только в приложении Universal Windows Platform (UWP).
  • API, для которых требуется идентификатор пакета (см. статью Функции, для которых требуется идентификатор пакета). Такие API поддерживаются только в классических приложениях, которые упаковываются с помощью MSIX.

В этой статье приведены сведения об этих двух наборах API WinRT. В этой статье предлагаются альтернативные API для обеспечения такой же функциональности, как и API, которые не поддерживаются в настольных приложениях. Большинство альтернативных API доступны в WinUI 3 или через com-интерфейсы WinRT, доступные в пакете SDK для Windows.

Замечание

Приложения, использующие .NET, могут использовать предоставленные реализации классов для некоторых интерфейсов COM WinRT, перечисленных в этой статье. Проще работать с этими классами, чем использовать COM-интерфейсы WinRT напрямую. Дополнительные сведения о доступных реализациях классов см. в статье Вызов API взаимодействия из приложения .NET. Обратите внимание, что для этих классов требуется пакет SDK .NET 6 или более поздней версии.

API-интерфейсы, зависящие от функций пользовательского интерфейса только для UWP

Ряд API-интерфейсов WinRT был разработан специально для сценариев пользовательского интерфейса в приложениях UWP. Эти API не работают должным образом в классических приложениях из-за потоковой модели и других различий платформ. Эти API и другие API WinRT, имеющие зависимости от них, не поддерживаются для использования в классических приложениях.

Основные неподдерживаемые классы

Эти классы WinRT не поддерживаются в классических приложениях:

Class Альтернативные API
ApplicationView None
CoreApplicationView Вместо этого используйте класс Window , предоставленный WinUI.
CoreApplicationViewTitleBar Вместо свойства ExtendViewIntoTitleBar используйте свойство Window.ExtendsContentIntoTitleBar , предоставленное WinUI.
CoreDispatcher Вместо этого используйте свойство Microsoft.UI.Xaml.Window.DispatcherQueue , предоставленное WinUI.

Обратите внимание, что свойства Windows.UI.Xaml.Window.Dispatcher и Windows.UI.Xaml.DependencyObject.Dispatcher возвращают значение null в классическом приложении.
CoreWindow См. также классы, реализующие IInitializeWithWindow в разделе ниже.

Вместо метода GetKeyState используйте метод InputKeyboardSource.GetKeyStateForCurrentThread , предоставляемый WinUI.

Вместо свойства PointerCursor используйте свойство UIElement.ProtectedCursor , предоставленное WinUI. Для обращения к этому свойству требуется подкласс UIElement.
UserActivity Вместо него используйте COM-интерфейс IUserActivitySourceHostInteropuseractivityinterop.h).

Другие API WinRT, которые не поддерживаются в классических приложениях, см в разделе "Неподдерживаемые элементы" далее в этом разделе.

Классы с методом XxxForCurrentView

Многие классы WinRT имеют статический метод GetForCurrentView или CreateForCurrentView, например UIViewSettings.GetForCurrentView. Эти методы XxxForCurrentView имеют неявную зависимость от типа ApplicationView, который не поддерживается в классических приложениях. Так как ApplicationView не поддерживается в классических приложениях, ни один из методов XxxForCurrentView не поддерживается. Некоторые неподдерживаемые методы XxxForCurrentView не только возвращают null, но и вызывают исключения.

Замечание

CoreInputView.GetForCurrentViewподдерживается в классических приложениях, и его можно использовать даже без CoreWindow. Этот метод можно использовать для получения объекта CoreInputView в любом потоке. Если этот поток имеет окно переднего плана, объект будет создавать события.

Следующие классы поддерживаются в классических приложениях. Но для получения экземпляра одного из них в классическом приложении используется механизм, отличный от методов GetForCurrentView или CreateForCurrentView. Для приведенных ниже классов, для которых COM-интерфейс указан в качестве альтернативного API, разработчики C# также могут использовать эти COM-интерфейсы WinRT (см. статью Вызов API взаимодействия из приложения .NET). Этот список может быть неполным.

Class Альтернативные API
AccountsSettingsPane Вместо него используйте COM-интерфейс IAccountsSettingsPaneInteropaccountssettingspaneinterop.h).
CoreDragDropManager Вместо этого используйте COM-интерфейс IDragDropManagerInteropdragdropinterop.h).
CoreTextServicesManager Этот класс сейчас поддерживается только в настольных приложениях в сборках Windows Insider Preview.
DataTransferManager Вместо этого используйте COM-интерфейс IDataTransferManagerInteropshobjidl_core.h).
DisplayInformation Чтобы получить экземпляр DisplayInformation, используйте интерфейс IDisplayInformationStaticsInterop.

Кроме того, вместо свойства LogicalDpi можно использовать свойство XamlRoot.RasterizationScale и прослушивать изменения с помощью события XamlRoot.Changed (свойство XamlRoot.RasterizationScale предоставляется в WinUI).

Вместо свойства RawPixelsPerViewPixel можно использовать свойство XamlRoot.RasterizationScale , предоставленное WinUI.
InputPane Вместо этого используйте COM-интерфейс IInputPaneInteropinputpaneinterop.h).
PlayToManager Вместо этого используйте COM-интерфейс IPlayToManagerInteropplaytomanagerinterop.h).
Print3DManager Вместо этого используйте COM-интерфейс IPrinting3DManagerInteropprint3dmanagerinterop.h).
PrintManager Вместо этого используйте COM-интерфейс IPrintManagerInteropprintmanagerinterop.h).
RadialController Вместо этого используйте COM-интерфейс IRadialControllerInteropradialcontrollerinterop.h).
RadialControllerConfiguration Вместо этого используйте COM-интерфейс IRadialControllerConfigurationInteropradialcontrollerinterop.h).
ResourceContext См. статью Переход с MRT на MRT Core.
ResourceLoader См. статью Переход с MRT на MRT Core.
SpatialInteractionManager Вместо этого используйте COM-интерфейс ISpatialInteractionManagerInteropspatialinteractionmanagerinterop.h).
SystemMediaTransportControls Вместо этого используйте COM-интерфейс ISystemMediaTransportControlsInteropsystemmediatransportcontrolsinterop.h).
UserActivityRequestManager Вместо этого используйте интерфейс COM IUserActivityRequestManagerInteropuseractivityinterop.h).
UIViewSettings Вместо этого используйте COM-интерфейс IUIViewSettingsInteropuiviewsettingsinterop.h).

Следующие классы не поддерживаются в классических приложениях, так как API не предоставляют альтернативу их методу GetForCurrentView или CreateForCurrentView. Этот список может быть неполным.

Class Альтернативные API
AppCapture None
BrightnessOverride None
ConnectedAnimationService None
CoreInputView None
CoreWindowResizeManager None
DisplayEnhancementOverride (Переопределение усиления дисплея) None
EdgeGesture None
GazeInputSourcePreview None
HdmiDisplayInformation None
HolographicKeyboardPlacementOverridePreview None
KeyboardDeliveryInterceptor None
LockApplicationHost None
MouseDevice None
Настройки визуализации указателя None
ProtectionPolicyManager None
SearchPane None
SettingsPane None
SystemNavigationManager None
SystemNavigationManagerPreview None
WebAuthenticationBroker Нет. Дополнительные сведения см. в статье WebAuthenticationBroker.AuthenticateAsync вызывает проблему COMException GitHub.

Классы, реализующие IInitializeWithWindow

Некоторые объекты выбора, всплывающие окна, диалоги и другие объекты среда выполнения Windows (WinRT) зависят от объекта CoreWindow; обычно для отображения пользовательского интерфейса. Несмотря на то, что CoreWindow не поддерживается в настольных приложениях (см. раздел Основные неподдерживаемые классы выше), вы по-прежнему можете использовать многие из этих классов WinRT в классическом приложении, добавив небольшой код взаимодействия.

Дополнительные сведения (включая список затронутых типов) и примеры кода см. в статье Отображение объектов пользовательского интерфейса WinRT, зависящих от CoreWindow.

Неподдерживаемые члены

В этом разделе перечислены (или описаны, если исчерпывающий список недоступен) определенные элементы классов WinRT, которые не поддерживаются в классических приложениях. Если не указано иное, остальные классы, за исключением этих членов, поддерживаются в настольных приложениях.

Events

Следующие классы поддерживаются в настольных приложениях, за исключением определённых событий.

Class Неподдерживаемые события
UISettings ИзмененыЗначенияЦвета
AccessibilitySettings HighContrastChanged

Методы

Следующие классы поддерживаются в классических приложениях, за исключением указанных методов.

Class Неподдерживаемые методы
СопряжениеИнформацииУстройства PairAsync

Методы, которые используют шаблон именования Request

Большинство методов, которые следуют шаблону именования с Request, например AppCapability.RequestAccessAsync и StoreContext.RequestPurchaseAsync, не поддерживаются в настольных приложениях. На внутреннем уровне эти методы используют класс Windows.UI.Popups. Для этого класса требуется, чтобы поток имел объект CoreWindow, который не поддерживается в настольных приложениях.

Полный список методов, которые используют шаблон именования Request, очень длинный и в этой статье не представлен.

API, требующие наличия идентификатора пакета

Для следующих классов WinRT требуется идентификатор пакета (см. статью Функции, для которых требуется идентификатор пакета). Эти API поддерживаются только в настольных приложениях, которые упакованы (т. е. имеют идентификатор пакета во время выполнения). Этот список может быть неполным.

Windows. ApplicationModel...

Windows.Data

Windows. Устройств...

Windows. Фонд...

Windows.Globalization

Windows.Graphics...

Windows.Management

Windows.Media

Windows.Networking...

Windows.Services.Maps...

Important

API платформы Windows Maps (Windows. Services.Maps.*) устарели и могут быть недоступны в будущих версиях Windows. Дополнительные сведения см. в разделе Ресурсы для устаревших функций.

Windows. Services.Store...

Windows. Хранения...

Windows.System...

Windows.UI...

Кроме того, при вызове из классического приложения, не имеющего идентификатора пакета, методы AdaptiveMediaSource.CreateFromUriAsync не поддерживают форматы URI ms-appx и ms-resource.