デスクトップ アプリでサポートされていない Windows ランタイム API

ほとんどの Windows ランタイム (WinRT) API は、デスクトップ アプリ (.NET およびネイティブ C++) で使用できますが、デスクトップ アプリでサポートされていなかったり、制限のある 2 つの主な WinRT API セットがあります。

  • UWP アプリでのみ使用するように設計された UI 機能に依存する API。
  • パッケージ ID が必要な API。 これらの API は、MSIX を使用してパッケージ化されたデスクトップ アプリでのみサポートされています。

この記事では、これらの WinRT API の両方のセットについて詳しく説明します。 入手可能な場合、この記事では、デスクトップ アプリでサポートされていない API と同じ機能を実現するための別の API を提案しています。 代替 API のほとんどは、WinUI 3 で、または Windows SDK で使用できる WinRT COM インターフェイスを介して利用できます。

Note

.NET を使用したアプリでは、この記事に示されている一部の WinRT COM インターフェイス用に提供されているクラス実装を利用できます。 これらのクラスは、WinRT COM インターフェイスを直接使用するよりも簡単に使用できます。 使用可能なクラス実装の詳細については、「.NET アプリから相互運用機能 API を呼び出す」を参照してください。 これらのクラスには .NET 6 SDK 以降が必要であることに注意してください。

この記事は、回避策や代替が増えてきたら更新されます。 ここに記載されていない API で問題が発生した場合は、API を使用して microsoft ui xaml リポジトリにイシューを作成し、それを使用して実現しようとしている内容の詳細を提供してください。

UWP 専用 UI 機能に依存する API

一部の WinRT API は UWP アプリでの UI シナリオ専用に設計されました。 これらの API は、スレッド モデルやその他のプラットフォームの違いにより、デスクトップ アプリで適切に動作しません。 これらの API および依存関係のあるその他の WinRT API は、デスクトップ アプリでの使用はサポートされていません。

サポートされていないコア クラス

次の WinRT クラスは、デスクトップ アプリではサポートされていません。

クラス 代替 API
ApplicationView None
CoreApplicationView 代わりに、WinUI 3 によって提供される Window クラスを使用します。
CoreApplicationViewTitleBar ExtendViewIntoTitleBar プロパティの代わりに、WinUI 3 によって提供される Window.ExtendsContentIntoTitleBar プロパティを使用してください。
CoreDispatcher 代わりに、WinUI 3 によって提供される Microsoft.UI.Xaml.Window.DispatcherQueue クラスを使用します。

Windows.UI.Xaml.Window.Dispatcher および Windows.UI.Xaml.DependencyObject.Dispatcher プロパティは、デスクトップ アプリで null を返すことに注意してください。
CoreWindow さらに以下の「IInitializeWithWindow を実装するクラス」セクションを参照してください。

GetKeyState メソッドの代わりに、WinUI 3 によって提供される InputKeyboardSource.GetKeyStateForCurrentThread メソッドを使用します。

PointerCursor プロパティの代わりに、WinUI 3 によって提供される UIElement.ProtectedCursor プロパティを使用します。 このプロパティにアクセスするには、UIElement のサブクラスが必要です。
UserActivity 代わりに IUserActivitySourceHostInterop COM インターフェイス (useractivityinterop.h 内) を使用します。

デスクトップ アプリでサポートされていないその他の WinRT API については、このトピックの後半にある「サポートされていないメンバー」を参照してください。

XxxForCurrentView メソッドによるクラス

多くの WinRT クラスには、UIViewSettings.GetForCurrentView など、静的な GetForCurrentView または CreateForCurrentView メソッドがあります。 これらの XxxForCurrentView メソッドは、デスクトップ アプリでサポートされていない ApplicationView 型に暗黙的に依存しています。 ApplicationView はデスクトップ アプリではサポートされていないため、いっさいの XxxForCurrentView メソッドもデスクトップ アプリでサポートされていません。 一部のサポートされていない XxxForCurrentView メソッドでは、null が返されるだけでなく、例外もスローされる場合があります。

注意

例外の 1 つとして、CoreInputView.GetForCurrentView があります。これはデスクトップ アプリで "サポートされており"、CoreWindow なしでも "使用できます"。 このメソッドは、任意のスレッドで CoreInputView オブジェクトを取得するために使用できます。また、そのスレッドに前面のウィンドウがある場合は、そのオブジェクトによってイベントが生成されます。

次のクラスは、デスクトップ アプリでサポートされて "います"。ただし、デスクトップ アプリでそのインスタンスを取得するには、GetForCurrentView または CreateForCurrentView メソッドとは異なるメカニズムを使います。 COM インターフェイスが代替 API として一覧表示されている以下のクラスの場合、C# 開発者は、これらの WinRT COM インターフェイスも使用することができます (「.NET 5 アプリから相互運用機能 API を呼び出す」を参照してください)。 この一覧は包括的でない場合があります。

クラス 代替 API
AccountsSettingsPane 代わりに IAccountsSettingsPaneInterop COM インターフェイス (accountssettingspaneinterop.h 内) を使用してください。
CoreDragDropManager 代わりに IDragDropManagerInterop COM インターフェイス (dragdropinterop.h 内) を使用します。
CoreTextServicesManager 現在、このクラスは Windows Insider Preview ビルドのデスクトップ アプリでのみサポートされています。
DataTransferManager 代わりに IDataTransferManagerInterop COM インターフェイス (shobjidl_core.h 内) を使用します。
DisplayInformation DisplayInformation のインスタンスを取得するには、IDisplayInformationStaticsInterop インターフェイスを使います。

または、LogicalDpi プロパティの代わりに XamlRoot.RasterizationScale プロパティを使って、XamlRoot.Changed イベントでの変更をリッスンすることができます (XamlRoot.RasterizationScale プロパティは WinUI 3 で提供されています)。

また、RawPixelsPerViewPixel プロパティの代わりに、WinUI 3 によって提供される XamlRoot.RasterizationScale プロパティを使う選択肢があります。
InputPane 代わりに IInputPaneInterop COM インターフェイス (inputpaneinterop.h 内) を使用します。
PlayToManager 代わりに IPlayToManagerInterop COM インターフェイス (playtomanagerinterop.h 内) を使用します。
Print3DManager 代わりに IPrinting3DManagerInterop COM インターフェイス (print3dmanagerinterop.h 内) を使用します。
PrintManager 代わりに IPrintManagerInterop COM インターフェイス (printmanagerinterop.h 内) を使用します。
RadialContoller IRadialControllerInterop COM インターフェイス (radialcontrollerinterop.h 内) を使用します。
RadialControllerConfiguration 代わりに IRadialControllerConfigurationInterop COM インターフェイス (radialcontrollerinterop.h 内) を使用します。
ResourceContext MRT から MRT Core への移行」を参照してください
ResourceLoader MRT から MRT Core への移行」を参照してください
SpatialInteractionManager 代わりに ISpatialInteractionManagerInterop COM インターフェイス (spatialinteractionmanagerinterop.h 内) を使用します。
SystemMediaTransportControls 代わりに ISystemMediaTransportControlsInterop COM インターフェイス (systemmediatransportcontrolsinterop.h 内) を使用してください。
UserActivityRequestManager 代わりに IUserActivityRequestManagerInterop COM インターフェイス (useractivityinterop.h 内) を使用してください。
UIViewSettings 代わりに IUIViewSettingsInterop COM インターフェイスを使用してください (uiviewsettingsinterop.h 内)。

次のクラスはデスクトップ アプリでは "サポートされていません"。これらは、GetForCurrentView または CreateForCurrentView メソッドの代替を提供していないためです。 この一覧は包括的でない場合があります。

クラス 代替 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
PointerVisualizationSettings None
ProtectionPolicyManager None
SearchPane None
SettingsPane None
SystemNavigationManager None
SystemNavigationManagerPreview None
WebAuthenticationBroker [なし] : 詳細については、こちらの GitHub イシューを参照してください。

IInitializeWithWindow を実装するクラス

特定のピッカー、ポップアップ、ダイアログ、およびその他の Windows ランタイム (WinRT) オブジェクトは、一般的にユーザー インターフェイス (UI) を表示するために CoreWindow に依存します。 CoreWindow はデスクトップ アプリではサポートされていませんが (前述の「コアでサポートされていないクラス」を参照してください)、わずかな相互運用コードを追加することで、デスクトップ アプリでそれらの WinRT クラスの多くを使用できます。

詳細情報 (影響を受ける型の一覧を含む) とコード例については、「CoreWindow に依存する WinRT UI オブジェクトを表示する」を参照してください。

サポートされていないメンバー

このセクションでは、デスクトップ アプリでの使用がサポートされていない WinRT クラスの特定のメンバーを一覧表示 (包括的な一覧がない場合は説明) します。 特に明記されていない限り、これらのメンバーとは別の、クラスの残りはデスクトップ アプリでサポートされます。

イベント

次のクラスは、指定されたイベントを除き、デスクトップ アプリでサポートされています。

クラス サポートされていないイベント
UISettings ColorValuesChanged
AccessibilitySettings HighContrastChanged

メソッド

次のクラスは、指定されたメソッドを除き、デスクトップ アプリでサポートされています。

クラス サポートされていないメソッド
DeviceInformationPairing PairAsync

Request 名前付けパターンを使用するメソッド

Request 名前付けパターンに従うメソッド (AppCapability.RequestAccessAsyncStoreContext.RequestPurchaseAsync など) は、デスクトップ アプリではサポートされていません。 内部的には、これらのメソッドは、Windows.UI.Popups クラスを使用します。 このクラスではスレッドに、デスクトップ アプリではサポートされていない CoreWindow オブジェクトが必要です。

Request 名前付けパターンに従うメソッドの完全な一覧は非常に長いため、この記事ではこれらのメソッドの包括的な一覧は提供していません。

パッケージ ID が必要な API

次の WinRT クラスには、パッケージ ID が必要です。 これらの API は、MSIX を使用してパッケージ化されたデスクトップ アプリでのみサポートされています。 この一覧は包括的でない場合があります。