如何使用 C++ 在 WinUI 3 中获取页面上的主窗口句柄

2024-01-10

我正在使用 C++ 开发 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


Only Window https://learn.microsoft.com/en-us/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.window实施IWindowNative https://learn.microsoft.com/en-us/windows/windows-app-sdk/api/win32/microsoft.ui.xaml.window/nn-microsoft-ui-xaml-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#,但代码已经使用互操作来访问本机 Windows API):检索类库 WinUI 3 中的窗口句柄 https://stackoverflow.com/a/74286947/403671

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 C++ 在 WinUI 3 中获取页面上的主窗口句柄 的相关文章

随机推荐