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

C# 从窗口句柄设置OpenFileDialog的所有者,c#,wpf,common-dialog,C#,Wpf,Common Dialog,我想设置的所有者(在命名空间Microsoft.Win32中,而不是System.Windows.Forms),但我只有窗口的句柄()(句柄不必来自我的应用程序,它可以是外部的) 这是可能的还是我被迫使用fromSystem.Windows.Forms 我想起到打电话的效果 受保护的抽象布尔运行对话框(IntPtr hwndOwner); 在基类内部,但它是受保护的。附近有路吗?我可以使用反射来获取这个方法并执行它吗,或者有一种“更干净”的方法来实现它吗 正常的ShowDialog()方法只允

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

这是可能的还是我被迫使用from
System.Windows.Forms

我想起到打电话的效果

受保护的抽象布尔运行对话框(IntPtr hwndOwner);
在基类内部,但它是受保护的。附近有路吗?我可以使用反射来获取这个方法并执行它吗,或者有一种“更干净”的方法来实现它吗

正常的
ShowDialog()
方法只允许一个
窗口,这是我没有的

当我只有句柄时,我使用此代码设置其他窗口的所有者,但是
WindowInteropHelper
的构造函数只接受一个
window
,而
CommondDialog
不从
window
继承:

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

    return (Window)hwndSource.RootVisual;
}
窗口;
国际所有权人;
var wih=新的窗口间插板(窗口);
拥有者=拥有者拥有者;

我怀疑这个问题仍然是某个堆栈溢出问题的重复,但我在快速搜索中没有找到明显的匹配候选项。所以

您可以通过将
HwndSource
RootVisual
属性值强制转换为
Window
来获得WPF
窗口对象:

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

    return (Window)hwndSource.RootVisual;
}

有关更多详细信息,请参阅。

我认为您已经被填满了,因为对话框是密封的,所以在调用
RunDialog
时,您甚至无法从它们派生并注入自己的句柄。WinForms版本包装相同的本机对话框,因此这可能是最好的选择。您可以欺骗并使用MethodInfo.Invoke()执行RunDialog。努力避免winforms版本不是很有用。这对外部HWND有效吗?例如,我为一个PDF阅读器(或其他随机程序)编写一个外接程序,并用这段代码调用我的C#方法,我真的得到了一个WPF窗口对象吗?这取决于你所说的“外部”是什么意思。当然,它应该适用于来自同一流程的任何HWND。跨进程共享句柄可能很棘手,但假设您有一个有效的HWND,否则您将能够使用它(例如,将消息发送到),它也可能在那里工作。很简单,你可以试试。我会试试的,谢谢你的回答,我最终会回来的。是的,我的意思是从不同的过程。