gpt4 book ai didi

c# - ProcessCmdKey 永远不会在从 WPF 应用程序启动的 WinForms 窗口中触发

转载 作者:行者123 更新时间:2023-11-30 21:18:25 25 4
gpt4 key购买 nike

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

问题的根源似乎是表单不再从 WinForms Application.Run 方法中初始化,因此它不再有自己的消息循环。有什么方法可以在 WPF 和 WinForms 窗口共享一个 UI 线程的同时解决这个问题,还是我必须为 WinForms 窗口设置一个单独的线程才能工作?我想尽可能避免它,因为我必须为现在通过简单方法调用完成的所有事情设置跨线程通信。

最佳答案

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

对此没有彻底的修复,对象模型差异太大。 System.Windows.Forms.Integration 提供两者之间的互操作,但在控件级别而非窗口级别工作。 Form.ShowDialog() 是一种可能的解决方法。

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

关于c# - ProcessCmdKey 永远不会在从 WPF 应用程序启动的 WinForms 窗口中触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4261148/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com