Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Bepaalde kiezers, pop-ups, dialoogvensters en andere Windows Runtime-objecten (WinRT) zijn afhankelijk van een CoreWindow; doorgaans om een gebruikersinterface (UI) weer te geven. Hoewel CoreWindow niet wordt ondersteund in bureaublad-apps (zie Core niet-ondersteunde klassen), kunt u nog steeds veel van deze WinRT-klassen in uw bureaublad-app gebruiken door een beetje interoperation-code toe te voegen.
Uw bureaublad-app kan WinUI 3, Windows Presentation Foundation (WPF)- of Windows Forms-apps (WinForms) zijn. Codevoorbeelden worden weergegeven in C# en C++/WinRT.
De vensterhandle (HWND) van het eigenaarvenster instellen voor het WinRT UI-object
Voor klassen die de IInitializeWithWindow-interface (of de equivalente IDataTransferManagerInterop-interface ) implementeren, kunt u die interface gebruiken om een eigenaarsvenster in te stellen voordat u het object weergeeft. Het is een proces in twee stappen.
- Bepaal welk venster de eigenaar is van het UI-object dat u wilt weergeven en haal de HWND van dat venster op. Zie Een venstergreep (HWND) ophalen voor meer informatie en codevoorbeelden voor deze stap.
- Roep vervolgens de juiste interoperabiliteits-API (voor C# of C++/WinRT) aan om een HWND (Owner Window Handle) in te stellen voor het WinRT UI-object.
Voor klassen die IInitializeWithWindow implementeren
Deze klassen implementeren 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, versie 1903 (10.0; Build 18362) en hoger
- Windows.System.LauncherOptions— Windows 10, versie 1903 (10.0; Build 18362) en hoger
- Windows.UI.Core.CoreWindowDialog
- Windows.UI.Core.CoreWindowFlyout
- Windows.UI.Popups.MessageDialog. Voor nieuwe apps raden we echter aan om in plaats daarvan het besturingselement ContentDialog te gebruiken.
- Windows.UI.Popups.PopupMenu
- Windows.UI.StartScreen.SecondaryTile
- Windows.Web.Http.Filters.HttpBaseProtocolFilter
Opmerking
De bovenstaande lijst is noodzakelijkerwijs onvolledig. Raadpleeg de documentatie van een type om te zien of IInitializeWithWindow (of een equivalente interop-interface) wordt geïmplementeerd.
De volgende secties bevatten codevoorbeelden om een FolderPicker weer te geven. Maar het is dezelfde techniek om een van de hierboven vermelde API's weer te geven.
WinUI 3 met C# (ook WPF/WinForms met .NET 6 of hoger)
Opmerking
In de codevoorbeelden in deze sectie wordt de interopklasse WinRT.Interop.WindowNative C# gebruikt. Als u .NET 6 of hoger target, kunt u die klasse gebruiken in een WPF- of WinForms-project. Zie Interop-API's aanroepen vanuit een .NET-app voor informatie over het instellen van uw project.
In de onderstaande C#-code wordt verwacht dat u het patroon al hebt gebruikt dat wordt beschreven in HWND (Retrieve a window handle). Als u vervolgens het eigenaarsvenster wilt instellen voor het UI-object dat u wilt weergeven, roept de code de methode Initialize aan op de interop-klasse WinRT.Interop.InitializeWithWindow C# . Zie Interop-API's aanroepen vanuit een .NET-app voor meer informatie over de C#-interop-klassen.
// 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 met C++
In de onderstaande C++/WinRT-code wordt verwacht dat u het patroon al hebt gebruikt dat wordt beschreven in Het ophalen van een venstergreep (HWND). Als u vervolgens het eigenaarsvenster wilt instellen voor het UI-object dat u wilt weergeven, roept de code de interoperabiliteitsmethode IInitializeWithWindow::Initialize aan.
// 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() };
}
Voor klassen die IDataTransferManagerInterop implementeren
De klasse Windows.ApplicationModel.DataTransfer.DataTransferManager implementeert de interface IDataTransferManagerInterop (waarmee u, zoals IInitializeWithWindow, een eigenaarsvenster kunt instellen).
In een desktop-app in plaats van de methode DataTransferManager.ShowShareUI aan te roepen, roept u IDataTransferManagerInterop::ShowShareUIForWindow aan, zoals wordt weergegeven in de onderstaande codevoorbeelden.
WinUI 3 met C# (ook WPF/WinForms met .NET 6 of hoger)
// 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 met 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);
}
...
Voor klassen die IUserConsentVerifierInterop implementeren
De klasse Windows.Security.Credentials.UI.UserConsentVerifier implementeert de interface IUserConsentVerifierInterop (waarmee u, zoals IInitializeWithWindow, een eigenaarsvenster kunt instellen).
In een bureaublad-applicatie, roep in plaats van de methode UserConsentVerifier.RequestVerificationAsync aan te roepen:
- C#. Roep de methode RequestVerificationForWindowAsync van de interop-klasse Windows.Security.Credentials.UI.UserConsentVerifierInterop C# aan. Zie Interop-API's aanroepen vanuit een .NET-app voor meer informatie over de C#-interop-klassen.
- C++/WinRT. Roep IUserConsentVerifierInterop::RequestVerificationForWindowAsync aan.
Zie UserConsentVerifier voor meer informatie en codevoorbeelden.
Voor klassen die andere interop-interfaces implementeren
Deze interfaces hebben methoden XxxForWindow, waarmee u een vensterhandgreep voor het eigenaarvenster (HWND) kunt instellen. U kunt deze interfaces rechtstreeks vanuit C++/WinRT gebruiken. Versies van de interfaces bestaan ook in de vorm van C#-klassen. Zie Interop-API's aanroepen vanuit een .NET-app voor meer informatie.
- IAccountsSettingsPaneInterop
- IDragDropManagerInterop
- IInputPaneInterop
- IPlayToManagerInterop
- IPrintManagerInterop
- IRadialControllerConfigurationInterop
- IRadialControllerIndependentInputSourceInterop
- IRadialControllerInterop
- ISpatialInteractionManagerInterop
- ISystemMediaTransportControlsInterop
- IUIViewSettingsInterop
- IWebAuthenticationCoreManagerInterop
Verwante onderwerpen
- Een window handle (HWND) ophalen
- WinUI 3
- Windows Presentation Foundation (WPF)
- Windows Forms (WinForms)
- C++/WinRT
- interop-API's aanroepen vanuit een .NET-app
Windows developer