用C++获取WinUI 3页面主窗口句柄

4urapxun  于 2023-02-14  发布在  其他
关注(0)|答案(1)|浏览(390)

我正在使用C++开发WinUI 3演示。

我想获得主窗口处理程序或本机窗口处理程序,以便在Page中打开Picker
我正在使用的代码块在Window上工作正常,但在Page上不工作。

  1. auto windowNative{ this->try_as<::IWindowNative>()};
  2. winrt::check_bool(windowNative);
  3. HWND hWnd{ 0 };
  4. windowNative->get_WindowHandle(&hWnd);

帮助我获取Page1.xaml.cpp中的MainWindow处理程序

eaf3rand

eaf3rand1#

只有Window实现了IWindowNative,所以需要传递window引用,或者如果确定进程中只有一个Window,可以使用如下代码:

  1. HWND GetProcessFirstWindowHandle(DWORD pid = 0)
  2. {
  3. struct ProcessWindow { DWORD pid; HWND hWnd; } pw = {};
  4. pw.pid = pid ? pid : GetCurrentProcessId();
  5. EnumWindows([](auto hWnd, auto lParam)
  6. {
  7. DWORD pid;
  8. GetWindowThreadProcessId(hWnd, &pid);
  9. if (pid != ((ProcessWindow*)lParam)->pid)
  10. return TRUE;
  11. ((ProcessWindow*)lParam)->hWnd = hWnd;
  12. return FALSE;
  13. }, (LPARAM)&pw);
  14. return pw.hWnd;
  15. }

例如,简单地这样称呼它:

  1. void MainWindow::myButton_Click(IInspectable const&, RoutedEventArgs const&)
  2. {
  3. auto hwnd = GetProcessFirstWindowHandle();
  4. }

您还可以对类名添加一些检查,如以下答案中所做的(它是C#,但代码已经使用互操作来访问本机Windows API):Retrive Window Handle in Class Library WinUI3

展开查看全部

相关问题