从 window 句柄设置 OpenFileDialog 的所有者

Set owner of OpenFileDialog from window handle

我想设置 window 的 OpenFileDialog (within namespace Microsoft.Win32 not System.Windows.Forms) but I only have the handle (IntPtr) 的所有者(句柄不必来自我的应用程序,它可以是外部的)。

这可能吗,还是我被迫使用 System.Windows.Forms 中的 OpenFileDialog

我要调用的效果

protected abstract bool RunDialog(IntPtr hwndOwner);

在基地 class CommonDialog 内,但它受到保护。有办法解决吗?我可以使用反射来获取此方法并执行它,还是有一种“更干净”的方法来做到这一点?

普通的ShowDialog()方法只允许Window,这是我没有的。

当我只有句柄时,我使用此代码设置其他 window 的所有者,但是 WindowInteropHelper 的构造函数只需要一个 WindowCommondDialog不继承自 Window:

Window window;
IntPtr ownerHwnd;
var wih = new WindowInteropHelper(window);
wih.Owner = ownerHwnd;

我怀疑这个问题仍然是 some Stack Overflow 问题的重复,但我在快速搜索中没有找到明显匹配的候选人。所以……

您可以通过将 HwndSourceRootVisual 属性 值转换为 Window 来获得 WPF Window 对象:

Window IntPtrToWindow(IntPtr hwnd)
{
    HwndSource hwndSource = HwndSource.FromHwnd(hwnd);

    return (Window)hwndSource.RootVisual;
}

有关详细信息,请参阅 HwndSource Class