Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Niektóre selektory, wyskakujące okienka, okna dialogowe i inne obiekty środowiska uruchomieniowego systemu Windows (WinRT) zależą od systemu CoreWindow; zazwyczaj do wyświetlania interfejsu użytkownika. Mimo że coreWindow nie jest obsługiwany w aplikacjach klasycznych (zobacz Podstawowe nieobsługiwane klasy), nadal można używać wielu z tych klas WinRT w aplikacji klasycznej, dodając trochę kodu współdziałania.
Twoja aplikacja desktopowa może być aplikacją WinUI 3, Windows Presentation Foundation (WPF) lub Windows Forms (WinForms). Przykłady kodu są prezentowane w językach C# i C++/WinRT.
Ustaw uchwyt okna właściciela (HWND) dla obiektu interfejsu użytkownika WinRT
W przypadku klas implementujących interfejs IInitializeWithWindow (lub równoważny interfejs IDataTransferManagerInterop ) można użyć tego interfejsu, aby ustawić okno właściciela obiektu przed jego wyświetleniem. Jest to proces dwuetapowy.
- Zdecyduj, które okno będzie właścicielem obiektu interfejsu użytkownika, który chcesz wyświetlić, i pobierz plik HWND tego okna. Aby uzyskać więcej szczegółów i przykładów kodu dotyczących tego kroku, zobacz Pobieranie uchwytu okna (HWND).
- Następnie wywołaj odpowiedni interfejs API współdziałania (dla języka C# lub C++/WinRT), aby ustawić uchwyt okna właściciela (HWND) dla obiektu interfejsu użytkownika WinRT.
W przypadku klas implementujących IInitializeWithWindow
Te klasy implementują 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, wersja 1903 (10.0; Kompilacja 18362) i nowsze
- Windows.System.LauncherOptions — Windows 10, wersja 1903 (10.0; Kompilacja 18362) i nowsze
- Windows.UI.Core.CoreWindowDialog
- Windows.UI.Core.CoreWindowFlyout
- Windows.UI.Popups.MessageDialog. Jednak w przypadku nowych aplikacji zalecamy użycie kontrolki ContentDialog .
- Windows.UI.Popups.PopupMenu
- Windows.UI.StartScreen.SecondaryTile
- Windows.Web.Http.Filters.HttpBaseProtocolFilter
Uwaga / Notatka
Powyższa lista jest prawdopodobnie niekompletna — zapoznaj się z dokumentacją typu, aby sprawdzić, czy implementuje interfejs IInitializeWithWindow (lub równoważny interfejs międzyoperacyjności).
W następnych sekcjach znajdują się przykłady kodu do wyświetlania FolderPicker. Jest to jednak ta sama technika wyświetlania dowolnego z wymienionych powyżej interfejsów API.
WinUI 3 z językiem C# (również WPF/WinForms z platformą .NET 6 lub nowszym)
Uwaga / Notatka
Przykłady kodu w tej sekcji używają klasy międzyoperacyjnej WinRT.Interop.WindowNative C#. Jeśli docelowy jest program .NET 6 lub nowszy, możesz użyć tej klasy w projekcie WPF lub WinForms. Aby uzyskać informacje o konfigurowaniu projektu w tym celu, zobacz Wywoływanie interfejsów API międzyoperacyjności z poziomu aplikacji platformy .NET.
Poniższy kod języka C# zakłada, że wzorzec opisany w Retrieve a window handle (HWND) został już użyty. Następnie, aby ustawić okno właściciela dla obiektu interfejsu użytkownika, który chcesz wyświetlić, kod wywołuje metodę Initialize w klasie międzyoperacyjnej WinRT.Interop.InitializeWithWindow C#. Aby uzyskać więcej informacji na temat klas międzyoperacyjności języka C#, zobacz Wywoływanie interfejsów API międzyoperacyjności z poziomu aplikacji platformy .NET.
// 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 z językiem C++
Kod C++/WinRT poniżej zakłada, że użyto już wzorca, który został udokumentowany w artykule zatytułowanym Pobieranie uchwytu okna (HWND). Następnie, aby ustawić okno właściciela dla obiektu interfejsu użytkownika, który chcesz wyświetlić, kod wywołuje metodę współdziałania 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() };
}
W przypadku klas implementujących IDataTransferManagerInterop
Klasa Windows.ApplicationModel.DataTransfer.DataTransferManager implementuje interfejs IDataTransferManagerInterop (taki jak IInitializeWithWindow, umożliwia ustawienie okna właściciela).
W aplikacji klasycznej zamiast wywoływania metody DataTransferManager.ShowShareUI wywołasz metodę IDataTransferManagerInterop::ShowShareUIForWindow, jak pokazano w poniższych przykładach kodu.
WinUI 3 z językiem C# (również WPF/WinForms z platformą .NET 6 lub nowszym)
// 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 z językiem 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);
}
...
W przypadku klas implementujących interfejs IUserConsentVerifierInterop
Klasa Windows.Security.Credentials.UI.UserConsentVerifier implementuje interfejs IUserConsentVerifierInterop (taki jak IInitializeWithWindow, umożliwia ustawienie okna właściciela).
W aplikacji desktopowej zamiast wywoływać metodę UserConsentVerifier.RequestVerificationAsync :
- C#. Wywołaj metodę RequestVerificationForWindowAsync klasy międzyoperacyjnej Windows.Security.Credentials.UI.UserConsentVerifierInterop C#. Aby uzyskać więcej informacji na temat klas międzyoperacyjności języka C#, zobacz Wywoływanie interfejsów API międzyoperacyjności z poziomu aplikacji platformy .NET.
- C++/WinRT. Wywołaj metodę IUserConsentVerifierInterop::RequestVerificationForWindowAsync.
Aby uzyskać więcej informacji i przykłady kodu, zobacz UserConsentVerifier.
W przypadku klas implementujących inne interfejsy międzyoperacyjne
Te interfejsy mają metody XxxForWindow , które umożliwiają ustawienie uchwytu okna właściciela (HWND). Tych interfejsów można używać bezpośrednio z poziomu języka C++/WinRT. Wersje interfejsów istnieją również w postaci klas języka C# — aby uzyskać więcej informacji, zobacz Wywoływanie interfejsów API międzyoperacyjności z aplikacji platformy .NET.
- IAccountsSettingsPaneInterop
- IDragDropManagerInterop
- IInputPaneInterop
- IPlayToManagerInterop
- IPrintManagerInterop
- IRadialControllerConfigurationInterop
- IRadialControllerIndependentInputSourceInterop
- IRadialControllerInterop
- ISpatialInteractionManagerInterop
- ISystemMediaTransportControlsInterop
- IUIViewSettingsInterop
- IWebAuthenticationCoreManagerInterop
Tematy pokrewne
- Pobierz uchwyt okna (HWND)
- WinUI 3
- Windows Presentation Foundation (WPF)
- Formularze systemu Windows (WinForms)
- C++/WinRT
- Wywoływanie interfejsów API międzyoperacyjnych z poziomu aplikacji .NET
Windows developer