Я работаю над демонстрацией WinUI 3 с использованием С++.
Я хочу, чтобы обработчик основного или собственного окна открывал Picker
внутри Page
.
Блок кода, который я использую, отлично работает на Window
, но не работает на Page
.
auto windowNative{ this->try_as<::IWindowNative>()};
winrt::check_bool(windowNative);
HWND hWnd{ 0 };
windowNative->get_WindowHandle(&hWnd);
Помогите мне получить MainWindow
Хендлер в Page1.xaml.cpp
@SimonMourier У меня в приложении только одно окно, а остальные страницы. Можете ли вы показать, как это сделать с помощью C++?
Код C# на самом деле является чистым взаимодействием, поэтому его легко перевести, например, stackoverflow.com/questions/1888863/…
@SimonMourier Это не сработало. Можете ли вы поделиться фрагментом кода или примером? Я разработчик С#, а не С++. Будет хорошо, если вы поделитесь простым для понимания примером или блоком кода.
Только Window реализует IWindowNative, поэтому вам нужно передать ссылку на окно, или, если вы уверены, что в вашем процессе только одно окно, вы можете использовать такой код:
HWND GetProcessFirstWindowHandle(DWORD pid = 0)
{
struct ProcessWindow { DWORD pid; HWND hWnd; } pw = {};
pw.pid = pid ? pid : GetCurrentProcessId();
EnumWindows([](auto hWnd, auto lParam)
{
DWORD pid;
GetWindowThreadProcessId(hWnd, &pid);
if (pid != ((ProcessWindow*)lParam)->pid)
return TRUE;
((ProcessWindow*)lParam)->hWnd = hWnd;
return FALSE;
}, (LPARAM)&pw);
return pw.hWnd;
}
И, например, назовите это просто так:
void MainWindow::myButton_Click(IInspectable const&, RoutedEventArgs const&)
{
auto hwnd = GetProcessFirstWindowHandle();
}
Вы также можете добавить некоторую проверку имени класса, например, что сделано в этом ответе (это C#, но код уже использует взаимодействие для доступа к собственным API-интерфейсам Windows): Получить дескриптор окна в библиотеке классов WinUI3
Привет Саймон. Можете ли вы помочь мне с открытием средства выбора файлов? Я все еще сталкиваюсь с этой проблемой - github.com/microsoft/microsoft-ui-xaml/issues/2716. Это ошибка и обсуждение, которым уже несколько лет, но у меня это тоже не работает.
Поднял еще вопрос - stackoverflow.com/questions/75443728/…
Только Window реализует IWindowNative, вам нужно как-то передать окно или считать, что оно только одно (зависит от вашего приложения) stackoverflow.com/questions/74273875/…