Создание приложения C# .NET с использованием WinUI 3 и возможностей взаимодействия Win32
Статья
В этой статье показано, как создать базовое приложение C# .NET с возможностями взаимодействия WinUI 3 и Win32 с помощью служб вызова платформы (PInvoke).
В этом примере мы укажем расположение и размер окна приложения, преобразуем и масштабируем его для соответствующего DPI, отключим кнопки "Свернуть" и "Развернуть" окна, наконец, выполним запрос к текущему процессу, чтобы отобразить список модулей, загруженных в текущем процессе.
С помощью WinUI 3 можно создавать экземпляры класса Window в разметке XAML.
Класс Window XAML был расширен для поддержки окон рабочего стола, преобразуя его в абстракцию всех низкоуровневых реализаций окон, которые используются моделями UWP и классическими приложениями. В частности, CoreWindow для UWP и дескрипторы окон (или объекты HWND) для Win32.
В следующем примере кода показан файл MainWindow.xaml из исходного приложения-шаблона, в котором класс Window используется в качестве корневого элемента для приложения.
Для вызова API-интерфейсов Win32, предоставленных в библиотеке User32.dll, добавьте PInvoke.User32 пакет NuGet с открытым кодом в проект Visual Studio (в меню Visual Studio выберите Инструменты -> Диспетчер пакетов NuGet -> Управление пакетами NuGet для решения... и найдите "Pinvoke.User32"). Дополнительные сведения см. в статье Вызов собственных функций из управляемого кода.
Диспетчер пакетов NuGet с выбранным PInvoke.User32.
Убедитесь, что установка прошла успешно, проверив папку Packages в проекте VS.
Пакеты Обозревателя решений с PInvoke.User32.
Затем дважды щелкните файл проекта приложения (или щелкните правой кнопкой мыши и выберите "Изменить файл проекта"), чтобы открыть файл в текстовом редакторе и убедиться, что файл проекта теперь содержит NuGet PackageReference для PInvoke.User32.
В файле кода программной части App.xaml.cs мы получаем дескриптор для Window с помощью метода COM-взаимодействия WinRT WindowNative.GetWindowHandle (см. статью Получение дескриптора окна (HWND)).
Этот метод вызывается из обработчика приложения OnLaunched, как показано ниже:
C#
///<summary>/// Invoked when the application is launched normally by the end user. Other entry points/// will be used such as when the application is launched to open a specific file.///</summary>///<param name="args">Details about the launch request and process.</param>protectedoverridevoidOnLaunched(Microsoft.UI.Xaml.LaunchActivatedEventArgs args)
{
m_window = new MainWindow();
var hwnd = WinRT.Interop.WindowNative.GetWindowHandle(m_window);
SetWindowDetails(hwnd, 800, 600);
m_window.Activate();
}
Затем вызовем метод SetWindowDetails, передав дескриптор окна и предпочтительные измерения. Не забудьте добавить директиву using static PInvoke.User32;.
В этом методе мы выполняем следующие действия:
Вызываем GetDpiForWindow, чтобы получить значение точек на дюйм (DPI) для окна (в Win32 используются фактические пиксели, а в WinUI 3 — эффективные пиксели). Это значение точек на дюйм используется для вычисления коэффициента масштабирования и применения его к ширине и высоте, указанным для окна.
Затем вызываем SetWindowPos, чтобы указать нужное расположение окна.
Наконец, вызываем SetWindowLong для отключения кнопок Свернуть и Развернуть.
Затем замените обработчик событий MyButton_Click следующим кодом.
Здесь мы получаем ссылку на текущий процесс, вызвав GetCurrentProcess. Затем выполним итерацию по коллекции модулей и добавим имя файла каждого объекта ProcessModule в отображаемую строку.
C#
privateasyncvoidmyButton_Click(object sender, RoutedEventArgs e)
{
myButton.Content = "Clicked";
var description = new System.Text.StringBuilder();
var process = System.Diagnostics.Process.GetCurrentProcess();
foreach (System.Diagnostics.ProcessModule module in process.Modules)
{
description.AppendLine(module.FileName);
}
cdTextBlock.Text = description.ToString();
await contentDialog.ShowAsync();
}
Скомпилируйте и запустите приложение.
После появления окна нажмите кнопку Display loaded modules (Отобразить загруженные модули).
Базовое приложение Win32 взаимодействия, описанное в этой статье.
Итоги
В этом статье мы рассмотрели доступ к базовой реализации окна, в данном случае Win32 и HWND, а также использование API-интерфейсов Win32 вместе с API-интерфейсами WinRT. Благодаря этому при создании классических приложений WinUI 3 мы можем использовать часть имеющегося кода классического приложения.
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.
Отзыв о Windows developer
Windows developer — это проект с открытым исходным кодом. Выберите ссылку, чтобы оставить отзыв:
Разработчики Windows имеют различные варианты создания приложений, работающих в Windows. В этом модуле представлены платформы пользовательского интерфейса Windows, доступные для разработки Windows. Он также содержит рекомендации по выбору оптимальной платформы для вашего приложения.
В этом разделе мы рекомендуем использовать некоторые подходы к тестированию и проверке функциональных возможностей в приложениях, созданных с помощью функций пользовательского интерфейса пакета SDK для приложений Windows и библиотеки пользовательского интерфейса Windows (WinUI).