从窗口句柄设置OpenFileDialog的所有者

本文关键字:所有者 OpenFileDialog 设置 窗口句柄 | 更新日期: 2023-09-27 18:01:17

我想设置OpenFileDialog的所有者(在命名空间Microsoft.Win32而不是System.Windows.Forms内),但我只有窗口的句柄(IntPtr)(句柄不必来自我的应用程序,它可能是外部的)。

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

我想达到调用

的效果
protected abstract bool RunDialog(IntPtr hwndOwner);

在基类CommonDialog中,但它是受保护的。有别的办法吗?我是否可以使用反射来获取这个方法并执行它,或者是否有一个"清理器"?怎么做呢?

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

当我只有句柄时,我使用这段代码来设置其他窗口的所有者,但是WindowInteropHelper的构造函数只接受WindowCommondDialog不继承Window:

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

从窗口句柄设置OpenFileDialog的所有者

我怀疑这个问题仍然是一些 Stack Overflow问题的重复,但是我在快速搜索中没有找到明显的密切匹配的候选问题。So…

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

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