代码之家  ›  专栏  ›  技术社区  ›  Kjetil Limkjær

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

  •  2
  • Kjetil Limkjær  · 技术社区  · 14 年前

    我有一个WinForms窗体,它以前是一个独立的应用程序,但现在作为一个较大的WPF应用程序的一部分启动。它仍然是一个单独的窗口,不包含在WPF窗口中。我看到的问题是窗口中的processCmdKey事件不再触发,所以我在处理特殊命令键时遇到问题。这通常可以正常工作,并且快捷方式处理代码与之前的代码保持不变。

    问题的根源似乎是表单不再由winforms应用程序初始化。请运行方法,这样它就不再有自己的消息循环。当wpf和winforms窗口共享一个ui线程时,是否有任何方法可以解决这个问题,或者我必须为winforms窗口设置一个单独的线程才能使其正常工作?如果可能的话,我想避免这种情况,因为我必须为现在通过简单方法调用完成的所有事情设置跨线程通信。

    1 回复  |  直到 10 年前
        1
  •  4
  •   Patrick Hofman Wahid Bitar    10 年前

    你的猜测是准确的, ProcessCmdKey() 直接从WinForms消息循环调用 Application.Run() . 您现在正在运行WPF消息循环,它对WinForms键盘处理一无所知。标签也应该是不正常的。

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

    是的,您可以启动一个新的STA线程(使用 Thread.SetApartmentState )然后打电话 应用程序.run() 启动WinForms消息循环。然而,一个令人讨厌的问题是,这些表单与WPF窗口没有z顺序关系。它们很容易在另一个应用程序的窗口后消失。修复需要抽搐的问题 SetParent() , the Owner 属性将引发异常。