我在saleslogix
windows插件中添加了一个.Net窗体,每个东西都正常工作但按下" Tab"在此控件中的键,而不是在下一个文本框上,控件转到下一个插件。
我搜索了很多内容并找不到解决方法,当我在另一个saleslogix
windows插件中添加浏览器控件时,此文本框中的页面中有多个文本框。令我惊讶的是,按Tab键它完美地工作,控制进入下一个文本框。
非常感谢任何帮助。
答案 0 :(得分:3)
当您在宿主应用程序中使用Winforms(以及许多其他UI类库)时,这是一个完全正常的事故。无论哪个控件具有焦点,都需要识别导航键,如Tab和光标键以及快捷键击键。一种方法是在每个单个控件上实现KeyDown事件处理程序。那当然是非常痛苦的。
因此它无法正常工作,当消息循环接收到 之前,会将焦点调到具有焦点的控件上。重写ProcessCmdKey()方法是执行此操作的一般方法。基本方法负责导航并识别菜单和按钮助记符。
问题是,它不是接收和发送消息的.NET消息循环。它是具有循环的主机应用程序。它不知道有关ProcessCmdKey()的bean。因此它不会被调用,导航也不起作用。
它往往在WebBrowser中工作,因为它是一个ActiveX控件。它旨在与其主机进行交互。特别是它协商决定哪一个处理密钥。 IOleInPlaceActiveObject::TranslateAccelerator() method执行此操作。不是.NET和主机应用程序中提供的那种管道很少被编写以提供替代方案。
你可以考虑“过度痛苦”的解决方案,但你不太喜欢它的声音。只有另外一种方法可以解决这个问题,你必须调用ShowDialog()
来显示你的表格。现在是调度的.NET循环,Tab和光标键工作正常。这往往是不受欢迎的建议,对话可能非常尴尬。如果你很幸运并且知道你正在做什么并且主持人可以处理它(通常不是),那么使用线程可以从模态中解脱出来。询问供应商的建议,特别是线程方面,是明智的。