Поделиться через


API среды выполнения Windows, не поддерживаемые в классических приложениях

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

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

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

Примечание.

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

Эта статья будет обновляться по мере определения обходных путей и вариантов замены. Если у вас возникнет проблема с API, не описанная здесь, сообщите о ней в репозитории microsoft-ui-xaml, указав имя API и сведения о реализуемой функции с помощью этого API.

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

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

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

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

Класс Альтернативные API
ApplicationView нет
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). Этот список может быть неполным.

Класс Альтернативные 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. Этот список может быть неполным.

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

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

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

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

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

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

События

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

Класс Неподдерживаемые события
UISettings ИзмененыЗначенияЦвета
Настройки специальных возможностей HighContrastChanged

Методы

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

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

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

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

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

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

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

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