我在一个.Net窗口插件中添加了一个saleslogix窗口表单,所有东西都正常工作,但是在这个控件中按下"Tab“键,而不是继续下一个文本框,该控件将转到下一个插件。
我已经搜索了很多,但找不到这方面的工作,当我在另一个saleslogix窗口插件中添加一个浏览器控件时,这个文本框中的页面中有多个文本框。令我惊讶的是,按下选项卡键,它完美地工作,控制转到下一个文本框。
任何帮助都是非常感谢的。
发布于 2015-10-16 11:37:26
当您在主机应用程序中使用Winforms (和许多其他UI类库)时,这是一个完全正常的问题。导航键,如Tab和游标键以及快捷键击键,无论哪个控件具有焦点,都需要被识别。这样做的一种方法是在每个控件上实现KeyDown事件处理程序。当然,这太痛苦了。
因此,它不是这样工作的,当消息循环接收到击键时,它就会被识别,然后再被分派到带有焦点的控件。重写ProcessCmdKey()方法是实现这一目的的一般方法。基本方法包括导航和识别菜单以及按钮助记符。
问题是,接收和分发消息的不是.NET消息循环。具有循环的是主机应用程序。而且它不了解ProcessCmdKey()方面的bean。所以它不会被调用,导航也不起作用。
它倾向于在WebBrowser中工作,因为它是一个ActiveX控件。它是为了与主机交互而设计的。特别是,它通过协商来决定哪一个人可以处理密钥。IOleInPlaceActiveObject::TranslateAccelerator()法就是这样做的。在.NET和主机应用程序中,很少会编写这样的管道来提供替代。
你可以考虑“过于痛苦”的解决方案,但你不太可能喜欢它的声音。只有一种很好的方法来解决这个问题,您必须调用ShowDialog()来显示您的表单。现在,分派的是.NET循环,Tab和游标键工作得很好。这往往是不受欢迎的建议,对话可能会相当尴尬。如果你很幸运,并且知道你在做什么,并且主机可以处理它(通常不会),那么使用线程可以消除模式的刺痛。询问供应商的意见,特别是线程方面,将是明智的。
https://stackoverflow.com/questions/33116632
复制相似问题