2

我在saleslogixwindows 插件中添加了一个 .Net windows 窗体,一切正常,但是在按此控件内的“Tab”键时,控件不会转到下一个文本框,而是转到下一个插件。

我已经搜索了很多,但找不到解决方法,当我在另一个saleslogixWindows 插件中添加浏览器控件时,此文本框内的页面中有多个文本框。令我惊讶的是,按 Tab 键它工作得很好,控制转到下一个文本框。

任何帮助深表感谢。

4

1 回答 1

3

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

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

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

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

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

于 2015-10-16T11:37:26.127 回答