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
),但我只有窗口的句柄()(句柄不必来自我的应用程序,它可以是外部的)
这是可能的还是我被迫使用fromSystem.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,否则您将能够使用它(例如,将消息发送到),它也可能在那里工作。很简单,你可以试试。我会试试的,谢谢你的回答,我最终会回来的。是的,我的意思是从不同的过程。