C# ProcessCmdKey从不在从WPF应用程序启动的WinForms窗口中激发

C# ProcessCmdKey从不在从WPF应用程序启动的WinForms窗口中激发,c#,wpf,winforms,C#,Wpf,Winforms,我有一个WinForms表单,它过去是一个独立的应用程序,但现在作为一个更大的WPF应用程序的一部分启动。它仍然是一个单独的窗口,不包含在WPF窗口中。我看到的问题是窗口中的ProcessCmdKey事件再也不会触发,因此我在处理特殊命令键时遇到问题。这可以正常工作,快捷方式处理代码与前面的代码相同 问题的根源似乎是表单不再从WinForms应用程序.Run方法初始化,因此它不再有自己的消息循环。在WPF和WinForms窗口仍然共享一个UI线程的情况下,有没有办法解决这个问题,或者我必须为Wi

我有一个WinForms表单,它过去是一个独立的应用程序,但现在作为一个更大的WPF应用程序的一部分启动。它仍然是一个单独的窗口,不包含在WPF窗口中。我看到的问题是窗口中的ProcessCmdKey事件再也不会触发,因此我在处理特殊命令键时遇到问题。这可以正常工作,快捷方式处理代码与前面的代码相同


问题的根源似乎是表单不再从WinForms应用程序.Run方法初始化,因此它不再有自己的消息循环。在WPF和WinForms窗口仍然共享一个UI线程的情况下,有没有办法解决这个问题,或者我必须为WinForms窗口设置一个单独的线程才能工作?如果可能的话,我希望避免这种情况,因为我必须为现在通过简单方法调用完成的所有事情设置跨线程通信。

您的猜测是准确的,
ProcessCmdKey()
直接从Winforms消息循环中调用,该循环由
Application.Run()
启动。您现在正在运行WPF消息循环,它对Winforms键盘处理一无所知。禁忌也应该是功能失调的

没有明确的解决方案,对象模型太不同了
System.Windows.Forms.Integration
提供了两者之间的互操作,但这在控制级别而不是窗口级别起作用
Form.ShowDialog()
是一种可能的解决方法


是的,您可以启动一个新的STA线程(使用
thread.SetApartmentState
)并调用
Application.Run()
,以启动Winforms消息循环。然而,一个令人讨厌的问题是,这些表单与WPF窗口没有Z顺序关系。它们将很容易消失在另一个应用程序的窗口后面。修复需要pinvoking
SetParent()
,则
Owner
属性将引发异常。

我明白了,谢谢您提供的信息。在这种特殊情况下,Z顺序实际上不会成为问题,因为windows将在单独的监视器上全屏运行。我现在已经应用了一个脏的补丁来代替干净的补丁。我已将所需的几个键注册为全局热键(使用user32.dll中的RegisterHotKey),并且仅当Winforms窗口具有焦点时才对它们执行操作。现在看来还可以,我可能会在稍后的阶段在WPF中重写窗口。