Tab 键在 windows saleslogix windows 中添加的控件(.Net 扩展名)中不起作用

Tab key does not work in windows control added (.Net extension) in saleslogix windows

我在 saleslogix windows 插件中添加了一个 .Net windows 表单,一切正常,但在此控件中按下 "Tab" 键时,控件不会转到下一个文本框,而是转到下一个插件。

我搜索了很多,找不到解决方法,当我在另一个 saleslogix windows 插件中添加浏览器控件时,此文本框内的页面有多个文本框在里面。令我惊讶的是,按下 Tab 键时它完美地工作并且控制转到下一个文本框。

非常感谢任何帮助。

当您在主机应用程序中使用 Winforms(以及许多其他 UI class 库)时,这是完全正常的事故。无论哪个控件具有焦点,都需要识别导航键,如 Tab 和光标键以及快捷键。一种方法是在 每个 单个控件上实现 KeyDown 事件处理程序。那当然太痛苦了。

所以它不能那样工作,当消息循环接收到击键时识别击键,它被分派到具有焦点的控件之前。覆盖 ProcessCmdKey() 方法是执行此操作的一般方法。基本方法负责导航和识别菜单和按钮助记符。

问题是,接收和发送消息的不是 .NET 消息循环。它是具有循环的主机应用程序。它不知道有关 ProcessCmdKey() 的 bean。所以它不会被调用,导航也不起作用。

它倾向于在 WebBrowser 中工作,因为它是一个 ActiveX 控件。它旨在与其主机进行交互。特别是它协商决定由哪一个来处理密钥。 IOleInPlaceActiveObject::TranslateAccelerator() method 就是这样做的。不是 .NET 中可用的那种管道,并且很少编写主机应用程序来提供替代方案。

您可以考虑 "excessively painful" 解决方案,但您不太可能喜欢它的声音。只有另一种合适的方法可以解决这个问题,您必须调用 ShowDialog() 来显示您的表单。现在是 .NET 循环进行调度,Tab 键和光标键可以正常工作。这往往是不受欢迎的建议,对话可能会很尴尬。如果你很幸运并且知道你在做什么并且主机可以处理它(通常不会)那么使用线程可以消除模态中的刺痛。向供应商寻求建议,尤其是线程方面的建议是明智的。