Dela via


Windows Runtime-API:er stöds inte i skrivbordsappar

Även om du kan använda de flesta Windows Runtime-API:er (WinRT) (se Windows UWP-namnområden) i C#- eller C++-skrivbordsappen finns det två huvuduppsättningar med WinRT-API:er som inte stöds i skrivbordsappar eller som har begränsningar:

  • API:er som har beroenden för användargränssnittsfunktioner (UI) som endast har utformats för användning i en UWP-app (Universal Windows Platform).
  • API:er som kräver paketidentitet (se funktioner som kräver paketidentitet). Sådana API:er stöds endast i skrivbordsappar som paketeras med hjälp av MSIX-.

Den här artikeln innehåller information om båda dessa uppsättningar med WinRT-API:er. I den här artikeln föreslås alternativa API:er för att uppnå samma funktioner som de API:er som inte stöds i skrivbordsappar. De flesta alternativa API:er är tillgängliga i WinUI 3 eller via WinRT COM-gränssnitt som är tillgängliga i Windows SDK.

Not

Appar som använder .NET kan använda tillhandahållna klassimplementeringar för några av WinRT COM-gränssnitten som anges i den här artikeln. Dessa klasser är enklare att arbeta med än att använda WinRT COM-gränssnitten direkt. Mer information om tillgängliga klassimplementeringar finns i Anropa interop-API:er från en .NET-app. Observera att dessa klasser kräver .NET 6 SDK eller senare.

Den här artikeln uppdateras när fler lösningar och ersättningar identifieras. Om du stöter på ett problem med ett API som inte visas här rapportera det som ett problem i microsoft-ui-xaml repo med API-namnet och information om vad du försöker uppnå genom att använda det.

API:er som är beroende av UI-funktioner som endast finns tillgängliga i UWP

Vissa WinRT-API:er har utformats specifikt för användargränssnittsscenarier i en UWP-app. Dessa API:er fungerar inte korrekt i skrivbordsappar på grund av trådningsmodellen och andra plattformsskillnader. Dessa API:er och andra WinRT-API:er som har beroenden på dem stöds inte för användning i skrivbordsappar.

Kärnklasser som inte stöds

Dessa WinRT-klasser stöds inte i skrivbordsappar:

Klass Alternativa API:er
ApplicationView Ingen
CoreApplicationView Använd klassen Window som tillhandahålls av WinUI 3 i stället.
CoreApplicationViewTitleBar I stället för egenskapen ExtendViewIntoTitleBar använder du egenskapen Window.ExtendsContentIntoTitleBar som tillhandahålls av WinUI 3.
CoreDispatcher Använd egenskapen Microsoft.UI.Xaml.Window.DispatcherQueue som tillhandahålls av WinUI 3 i stället.

Observera att Windows.UI.Xaml.Window.Dispatcher och Windows.UI.Xaml.DependencyObject.Dispatcher egenskaper returnerar null i en skrivbordsapp.
CoreWindow Se även avsnittet klasser som implementerar IInitializeWithWindow nedan.

I stället för metoden GetKeyState använder du metoden InputKeyboardSource.GetKeyStateForCurrentThread som tillhandahålls av WinUI 3.

I stället för egenskapen PointerCursor använder du egenskapen UIElement.ProtectedCursor som tillhandahålls av WinUI 3. Du måste ha en underklass av UIElement för att få åtkomst till den egenskapen.
UserActivity Använd com-gränssnittet IUserActivitySourceHostInterop i stället (i useractivityinterop.h).

Andra WinRT-API:er som inte stöds i skrivbordsappar finns i Medlemmar som inte stöds längre fram i avsnittet.

Klasser med en XxxForCurrentView-metod

Många WinRT-klasser har en statisk GetForCurrentView--metoden eller CreateForCurrentView--metoden, till exempel UIViewSettings.GetForCurrentView. Dessa XxxForCurrentView- metoder har ett implicit beroende av ApplicationView- typ, som inte stöds i skrivbordsappar. Eftersom ApplicationView inte stöds i skrivbordsappar stöds inte heller någon av XxxForCurrentView- metoder. Vissa metoder som inte stöds XxxForCurrentView returnerar inte bara null, utan även utlöser undantag.

Not

CoreInputView.GetForCurrentViewstöds i skrivbordsappar och kan användas även utan CoreWindow. Du kan använda den metoden för att hämta ett CoreInputView- objekt på valfri tråd. och om tråden har ett förgrundsfönster skapar objektet händelser.

Följande klasser stöds i skrivbordsappar; men för att hämta en instans av en sådan i en skrivbordsapp använder du en mekanism som skiljer sig från GetForCurrentView- eller CreateForCurrentView- metoder. För klasserna nedan som har ett COM-gränssnitt som anges som alternativt API kan C#-utvecklare också använda dessa WinRT COM-gränssnitt (se Anropa interop-API:er från en .NET-app). Listan kanske inte är omfattande.

Klass Alternativa API:er
AccountsSettingsPane Använd com-gränssnittet IAccountsSettingsPaneInterop i stället (i accountssettingspaneinterop.h).
CoreDragDropManager Använd com-gränssnittet IDragDropManagerInterop i stället (i dragdropinterop.h).
CoreTextServicesManager Den här klassen stöds för närvarande endast i skrivbordsappar i Windows Insider Preview-versioner.
DataTransferManager Använd com-gränssnittet IDataTransferManagerInterop i stället (i shobjidl_core.h).
Visningsinformation Om du vill hämta en instans av DisplayInformationanvänder du gränssnittet IDisplayInformationStaticsInterop.

I stället för egenskapen LogicalDpi kan du använda egenskapen XamlRoot.RasterizationScale och lyssna efter ändringar via XamlRoot.Changed event (XamlRoot.RasterizationScale-egenskapen anges i WinUI 3).

Och i stället för egenskapen RawPixelsPerViewPixel kan du använda egenskapen XamlRoot.RasterizationScale som tillhandahålls av WinUI 3.
InputPane Använd com-gränssnittet IInputPaneInterop i stället (i inputpaneinterop.h).
PlayToManager Använd com-gränssnittet IPlayToManagerInterop i stället (i playtomanagerinterop.h).
Print3DManager Använd com-gränssnittet IPrinting3DManagerInterop i stället (i print3dmanagerinterop.h).
Utskriftshanterare Använd com-gränssnittet IPrintManagerInterop i stället (i printmanagerinterop.h).
Radialkontroller Använd IRadialControllerInterop COM-gränssnittet i stället (i radialcontrollerinterop.h).
RadialControllerConfiguration Använd com-gränssnittet IRadialControllerConfigurationInterop i stället (i radialcontrollerinterop.h).
Resurskontext Kontrollera MRT för migrering till MRT Core.
ResourceLoader Se även MRT till MRT Core-migrering.
SpatialInteractionManager Använd com-gränssnittet ISpatialInteractionManagerInterop i stället (i spatialinteractionmanagerinterop.h).
SystemMediaTransportControls Använd com-gränssnittet ISystemMediaTransportControlsInterop i stället (i systemmediatransportcontrolsinterop.h).
UserActivityRequestManager Använd com-gränssnittet IUserActivityRequestManagerInterop i stället (i useractivityinterop.h).
UIViewSettings Använd com-gränssnittet IUIViewSettingsInterop i stället (i uiviewsettingsinterop.h).

Följande klasser stöds inte i skrivbordsappar eftersom API:erna inte tillhandahåller något alternativ till metoden GetForCurrentView eller CreateForCurrentView. Listan kanske inte är omfattande.

Klass Alternativa API:er
AppCapture Ingen
BrightnessOverride Ingen
ConnectedAnimationService Ingen
CoreInputView Ingen
CoreWindowResizeManager Ingen
Skärmförbättringsöverskrivning Ingen
EdgeGesture Ingen
GazeInputSourcePreview Ingen
HdmiDisplayInformation Ingen
HolographicKeyboardPlacementOverridePreview Ingen
KeyboardDeliveryInterceptor Ingen
LockApplicationHost Ingen
Musenhet Ingen
Pekarvisualiseringsinställningar Ingen
Skyddspolicyhanterare Ingen
SökFönster Ingen
InställningarPanel Ingen
SystemNavigationManager Ingen
SystemNavigationManagerPreview Ingen
WebAuthenticationBroker Ingen. Mer information finns i WebAuthenticationBroker.AuthenticateAsync utlöser COMException GitHub-ärende.

Klasser som implementerar IInitializeWithWindow

Vissa väljare, popup-fönster, dialogrutor och andra WinRT-objekt (Windows Runtime) är beroende av en CoreWindow-; för att visa ett användargränssnitt. Även om CoreWindow inte stöds i skrivbordsappar (se Core-klasser som inte stöds ovan), kan du fortfarande använda många av dessa WinRT-klasser i din skrivbordsapp genom att lägga till lite kod för interoperation.

Mer information (inklusive en lista över berörda typer) och kodexempel finns i Visa WinRT-gränssnittsobjekt som är beroende av CoreWindow.

Medlemmar som inte stöds

Det här avsnittet visar (eller beskriver, där en omfattande lista inte är möjlig) specifika medlemmar i WinRT-klasser som inte stöds för användning i skrivbordsappar. Om inget annat anges stöds resten av klasserna förutom dessa medlemmar i skrivbordsappar.

Evenemang

Följande klasser stöds i skrivbordsappar, förutom de angivna händelseerna.

Klass Händelser som inte stöds
Användarinställningar FärgVärdenÄndrade
HjälpmedelInställningar HighContrastChanged

Metoder

Följande klasser stöds i skrivbordsappar, förutom de angivna metoderna.

Klass Metoder som inte stöds
Enhetsinformationsparning PairAsync-

Metoder som använder mönster för namngivning av begäranden

De flesta metoder som följer namngivningsmönstret Request – till exempel AppCapability.RequestAccessAsync och StoreContext.RequestPurchaseAsync– stöds inte i skrivbordsappar. Internt använder dessa metoder klassen Windows.UI.Popups. Den klassen kräver att tråden har ett CoreWindow- objekt, som inte stöds i skrivbordsappar.

Den fullständiga listan över metoder som följer Begäran namngivningsmönstret är mycket lång, och den här artikeln innehåller inte någon omfattande lista över dessa metoder.

API:er som kräver paketidentitet

Följande WinRT-klasser kräver paketidentitet (se funktioner som kräver paketidentitet). Dessa API:er stöds endast i skrivbordsappar som är paketerade (dvs. som har paketidentitet vid körning). Listan kanske inte är omfattande.

När den anropas från en skrivbordsapp som inte har paketidentitet stöder inte AdaptiveMediaSource.CreateFromUriAsync-metoderna inte ms-appx- och ms-resource URI-format.