如何在WPF中获取窗口句柄?

3
我有一个WPF项目,它被编译成一个dll并将从另一个应用程序中调用。这是它的设置方式。 在这个WPF项目中,我需要从主窗口的视图模型弹出一个自定义消息框,向用户显示消息。这个自定义消息框需要一个Window参数。就是这样。
对于一个WPF应用程序,Application.Current.MainWindow可以得到我需要的内容。但这里是一个dll,所以Application.Current为空,会导致运行时异常。 我也尝试过像Window.GetWindow(this)这样的方法。 这里不起作用,因为'this'是视图模型,所以它不会给我主窗口的句柄。
还有什么其他办法可以在这里获取主窗口的句柄吗?
谢谢。

为什么需要主窗口来弹出其他消息框? - Nitin
你可以通过 Reflection 获取它,并通过 Activator.CreateInstance() 实例化它。 - Omri Btian
你能多讲一些如何使用反射来做到这一点吗? - user2417994
视图模型将如何创建?某人必须创建主窗口和视图模型并将它们组合在一起。这就是你可以做些什么的地方。但另一方面,您不希望视图在视图模型中过于显眼... Cinch MVVM框架有一种很好的方法以相对较弱的方式将它们连接起来... - meilke
@user2417994,我发布了一个使用反射的小例子来回答你的问题,但我必须说我仍然不完全理解你的需求。如果你只是想在另一个应用程序中显示WPF程序集中的自定义消息框,那么可以通过反射实现,而无需访问WPF应用程序的主窗口。如果你需要其他东西,请详细说明...我会相应地更新我的答案 :) - Omri Btian
1个回答

0

一旦你获得了应用程序的dll,并且假设你知道窗口的名称,你可以通过反射获取和实例化它。

string myWpfAssemblyPath = ""; // Enter the path to your application here
Assembly wpfAppAssembly = Assembly.Load(myWpfAssemblyPath);

var MainWindow = (Window)wpfAppAssembly.CreateInstance("myMainWindow");

请注意,这将创建一个新的窗口实例,而不是获取已在运行的窗口的句柄。要获取已经实例化的窗口句柄,您可以使用WIN32 API。
以下是一些链接,以帮助您完成此操作: 从窗口句柄获取窗口实例 获取应用程序的窗口句柄

http://social.msdn.microsoft.com/Forums/vstudio/en-US/1d7bd916-9bbe-4c76-b9a0-8306159035a1/faq-item-how-to-retrieve-a-window-handle-in-visual-cnet

希望这能有所帮助


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接