我有一个WinForms表单曾经是一个独立的应用程序,但现在作为更大的WPF应用程序的一部分启动。它仍然是一个单独的窗口,不包含在WPF窗口中。我看到的问题是窗口中的ProcessCmdKey事件不再发生,所以我在处理特殊命令键时遇到问题。这曾经工作正常,快捷方式处理代码与之前相同。
问题的根源似乎是表单不再来自WinForms Application.Run方法,因此它不再有自己的消息循环。有没有办法解决这个问题,同时仍然让WPF和WinForms窗口共享一个UI线程,或者我必须为WinForms窗口设置一个单独的线程才能使用它?我想尽可能避免使用它,因为我必须为现在通过简单方法调用完成的所有事情设置跨线程通信。
答案 0 :(得分:4)
您的猜测是准确的,ProcessCmdKey()
是由Application.Run()
启动的Winforms消息循环直接调用的。您现在正在运行WPF消息循环,它对Winforms键盘处理一无所知。标签也应该是功能失调。
对此没有干净的解决方法,对象模型太不同了。 System.Windows.Forms.Integration
提供了两者之间的互操作,但它在控件级别而不是窗口级别工作。 Form.ShowDialog()
是一种可行的解决方法。
是的,你可以启动一个新的STA线程(使用Thread.SetApartmentState
)并调用Application.Run()
来启动Winforms消息循环。然而,令人讨厌的问题是这些表单与WPF窗口没有Z顺序关系。它们很容易消失在另一个应用程序的窗口后面。修复需要调整SetParent()
,Owner
属性将抛出异常。