Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Vissa väljare, popup-fönster, dialogrutor och andra WinRT-objekt (Windows Runtime) är beroende av en CoreWindow. vanligtvis för att visa ett användargränssnitt (UI). Även om CoreWindow inte stöds i skrivbordsappar (se Core-klasser som inte stöds) kan du fortfarande använda många av dessa WinRT-klasser i din skrivbordsapp genom att lägga till lite kod för samverkan.
Din skrivbordsapp kan vara WinUI 3-, Windows Presentation Foundation-appar (WPF) eller WinForms-appar (Windows Forms). Kodexempel visas i C# och C++/WinRT.
Ange ägarfönstrets handtag (HWND) för ett WinRT-användargränssnittsobjekt
För klasser som implementerar gränssnittet IInitializeWithWindow (eller motsvarande IDataTransferManagerInterop-gränssnitt ) kan du använda det gränssnittet för att ange ett ägarfönster på objektet innan du visar det. Det är en process i två steg.
- Bestäm vilket fönster som ska vara ägare till det användargränssnittsobjekt som du vill visa och hämta fönstrets HWND. Mer information och kodexempel för det här steget finns i Hämta ett fönsterhandtag (HWND).
- Anropa sedan lämpligt API för samverkan (för C# eller C++/WinRT) för att ange ett ägarfönsterhandtag (HWND) för WinRT-användargränssnittsobjektet.
För klasser som implementerar IInitializeWithWindow
Dessa klasser implementerar IInitializeWithWindow:
- Windows.ApplicationModel.Contacts.PinnedContactManager
- Windows.ApplicationModel.Payments.PaymentMediator
- Windows.Devices.Enumeration.DevicePicker
- Windows.Graphics.Capture.GraphicsCapturePicker
- Windows.Media.Casting.CastingDevicePicker
- Windows.Media.DialProtocol.DialDevicePicker
- Windows.Networking.NetworkOperators.ProvisioningAgent
- Windows.Security.Authentication.OnlineId.OnlineIdAuthenticator
- Windows.Services.Store.StoreContext
- Windows.Storage.Pickers.FileOpenPicker
- Windows.Storage.Pickers.FileSavePicker
- Windows.Storage.Pickers.FolderPicker
- Windows.System.FolderLauncherOptions – Windows 10, version 1903 (10.0; Build 18362) och senare
- Windows.System.LauncherOptions – Windows 10, version 1903 (10.0; Build 18362) och senare
- Windows.UI.Core.CoreWindowDialog
- Windows.UI.Core.CoreWindowFlyout
- Windows.UI.Popups.MessageDialog. Men för nya appar rekommenderar vi att du använder ContentDialog-kontrollen i stället.
- Windows.UI.Popups.PopupMenu
- Windows.UI.StartScreen.SecondaryTile
- Windows.Web.Http.Filters.HttpBaseProtocolFilter
Anmärkning
Listan ovan är nödvändigtvis ofullständig – se en typs dokumentation för att se om den implementerar IInitializeWithWindow (eller ett motsvarande interop-gränssnitt).
Nästa avsnitt innehåller kodexempel för att visa en FolderPicker. Men det är samma teknik att visa något av de API:er som anges ovan.
WinUI 3 med C# (även WPF/WinForms med .NET 6 eller senare)
Anmärkning
Kodexemplen i det här avsnittet använder klassen WinRT.Interop.WindowNative C# interop. Om du riktar in dig på .NET 6 eller senare kan du använda den klassen i ett WPF- eller WinForms-projekt. Information om hur du konfigurerar projektet för att göra det finns i Anropa interop-API:er från en .NET-app.
C#-koden nedan förväntar sig att du redan har använt mönstret som dokumenterats i Hämta ett fönsterhandtag (HWND). Om du sedan vill ange ägarfönstret för det gränssnittsobjekt som du vill visa anropar koden metoden Initialize i interop-klassen WinRT.Interop.InitializeWithWindow C#. Mer information om C#-interopklasserna finns i Anropa interop-API:er från en .NET-app.
// MainWindow.xaml.cs
private async void ShowFolderPickerAsync(IntPtr hWnd)
{
// Create a folder picker.
var folderPicker = new Windows.Storage.Pickers.FolderPicker();
// 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();
}
WinUI 3 med C++
C++/WinRT-koden nedan förväntar sig att du redan har använt mönstret som dokumenterats i Hämta ett fönsterhandtag (HWND). För att sedan ange ägarfönstret för det gränssnittsobjekt som du vill visa anropar koden samverkansmetoden IInitializeWithWindow::Initialize.
// pch.h
...
#include <microsoft.ui.xaml.window.h>
#include <Shobjidl.h>
#include <winrt/Windows.Storage.Pickers.h>
// MainWindow.xaml.cpp
winrt::fire_and_forget ShowFolderPickerAsync(HWND hWnd)
{
// Create a folder picker.
Windows::Storage::Pickers::FolderPicker folderPicker;
// Initialize the folder picker with the window handle (HWND).
auto initializeWithWindow{ folderPicker.as<::IInitializeWithWindow>() };
initializeWithWindow->Initialize(hWnd);
// Use the folder picker as usual.
folderPicker.FileTypeFilter().Append(L"*");
auto folder{ co_await folderPicker.PickSingleFolderAsync() };
}
För klasser som implementerar IDataTransferManagerInterop
Klassen Windows.ApplicationModel.DataTransfer.DataTransferManager implementerar IDataTransferManagerInterop-gränssnittet (vilket, precis som IInitializeWithWindow, låter dig ange ett ägarfönster).
I en skrivbordsapp anropar du istället IDataTransferManagerInterop::ShowShareUIForWindow, istället för att anropa metoden DataTransferManager.ShowShareUI, vilket framgår av kodexemplen nedan.
WinUI 3 med C# (även WPF/WinForms med .NET 6 eller senare)
// MainWindow.xaml.cs
...
public sealed partial class MainWindow : Window
{
...
[System.Runtime.InteropServices.ComImport]
[System.Runtime.InteropServices.Guid("3A3DCD6C-3EAB-43DC-BCDE-45671CE800C8")]
[System.Runtime.InteropServices.InterfaceType(
System.Runtime.InteropServices.ComInterfaceType.InterfaceIsIUnknown)]
interface IDataTransferManagerInterop
{
IntPtr GetForWindow([System.Runtime.InteropServices.In] IntPtr appWindow,
[System.Runtime.InteropServices.In] ref Guid riid);
void ShowShareUIForWindow(IntPtr appWindow);
}
static readonly Guid _dtm_iid =
new Guid(0xa5caee9b, 0x8708, 0x49d1, 0x8d, 0x36, 0x67, 0xd2, 0x5a, 0x8d, 0xa0, 0x0c);
private void myButton_Click(object sender, RoutedEventArgs e)
{
// Retrieve the window handle (HWND) of the current WinUI 3 window.
var hWnd = WinRT.Interop.WindowNative.GetWindowHandle(this);
IDataTransferManagerInterop interop =
Windows.ApplicationModel.DataTransfer.DataTransferManager.As
<IDataTransferManagerInterop>();
IntPtr result = interop.GetForWindow(hWnd, _dtm_iid);
var dataTransferManager = WinRT.MarshalInterface
<Windows.ApplicationModel.DataTransfer.DataTransferManager>.FromAbi(result);
dataTransferManager.DataRequested += (sender, args) =>
{
args.Request.Data.Properties.Title = "In a desktop app...";
args.Request.Data.SetText("...display WinRT UI objects that depend on CoreWindow.");
args.Request.Data.RequestedOperation =
Windows.ApplicationModel.DataTransfer.DataPackageOperation.Copy;
};
// Show the Share UI
interop.ShowShareUIForWindow(hWnd);
}
}
...
WinUI 3 med C++
// pch.h in a Windows App SDK app
...
#include <shobjidl_core.h>
#include <microsoft.ui.xaml.window.h>
#include <winrt/Windows.ApplicationModel.DataTransfer.h>
...
// MainWindow.xaml.cpp
...
void MainWindow::myButton_Click(IInspectable const&, RoutedEventArgs const&)
{
// Retrieve the window handle (HWND) of the current WinUI 3 window.
auto windowNative{ this->m_inner.as<::IWindowNative>() };
HWND hWnd{ 0 };
windowNative->get_WindowHandle(&hWnd);
winrt::com_ptr<IDataTransferManagerInterop> interop =
winrt::get_activation_factory<Windows::ApplicationModel::DataTransfer::DataTransferManager,
IDataTransferManagerInterop>();
winrt::guid _dtm_iid{ 0xa5caee9b, 0x8708, 0x49d1, { 0x8d, 0x36, 0x67, 0xd2, 0x5a, 0x8d, 0xa0, 0x0c } };
Windows::ApplicationModel::DataTransfer::DataTransferManager dataTransferManager{ nullptr };
interop->GetForWindow(hWnd, _dtm_iid, winrt::put_abi(dataTransferManager));
dataTransferManager.DataRequested([](Windows::ApplicationModel::DataTransfer::DataTransferManager const& /* sender */,
Windows::ApplicationModel::DataTransfer::DataRequestedEventArgs const& args)
{
args.Request().Data().Properties().Title(L"In a desktop app...");
args.Request().Data().SetText(L"...display WinRT UI objects that depend on CoreWindow.");
args.Request().Data().RequestedOperation(Windows::ApplicationModel::DataTransfer::DataPackageOperation::Copy);
});
interop->ShowShareUIForWindow(hWnd);
}
...
För klasser som implementerar IUserConsentVerifierInterop
Klassen Windows.Security.Credentials.UI.UserConsentVerifier implementerar IUserConsentVerifierInterop-gränssnittet (liksom IInitializeWithWindow, ger det dig möjlighet att ange ett ägarfönster).
Istället för att kalla på metoden UserConsentVerifier.RequestVerificationAsync i en skrivbordsapp:
- C#. Anropa RequestVerificationForWindowAsync-metoden i Windows.Security.Credentials.UI.UserConsentVerifierInterop C#-interopklass. Mer information om C#-interopklasserna finns i Anropa interop-API:er från en .NET-app.
- C++/WinRT. Anropa IUserConsentVerifierInterop::RequestVerificationForWindowAsync.
Mer information och kodexempel finns i UserConsentVerifier.
För klasser som implementerar andra interop-gränssnitt
Dessa gränssnitt har XxxForWindow-metoder som gör att du kan ange ett ägarfönsterhandtag (HWND). Du kan använda dessa gränssnitt direkt från C++/WinRT. Versioner av gränssnitten finns också i form av C#-klasser – mer information finns i Anropa interop-API:er från en .NET-app.
- IAccountsSettingsPaneInterop
- IDragDropManagerInterop
- IInputPaneInterop
- IPlayToManagerInterop
- IPrintManagerInterop
- IRadialControllerConfigurationInterop
- IRadialControllerIndependentInputSourceInterop
- IRadialControllerInterop
- ISpatialInteractionManagerInterop
- ISystemMediaTransportControlsInterop
- IUIViewSettingsInterop
- IWebAuthenticationCoreManagerInterop
Relaterade ämnen
Windows developer