2009-07-10 76 views
4

编辑:除了赏金之外,我们愿意支付250美元让这个bug在Firefox/Gecko代码库中得到修复。 Here is a simple test project(Visual Studio 2008 C#)可以重现问题。Firefox/Gecko控件干扰Windows Forms按键

编辑#2我们愿意支付600美元修复此错误。请参阅上面的示例项目来重现问题。

我们的C#Windows窗体上有一个Firefox(Gecko)ActiveX控件来显示HTML。

当这个Firefox ActiveX控件位于我们的窗体上时,大约2-3%的按键不能通过。或者说,发送一个不同的Windows消息:

我们按住TAB键以通过3个常规WinForms文本框选项卡。它的行为正确率为97%。间谍++告诉我们WM_KEYDOWN消息正确发送:

normal behavior http://judahhimango.com/images/normaltab.jpg

但随机,时间也许2-3%,Tab键(或其他键)不处理权。间谍++告诉我们WM_CHAR正被发送,而不是:

odd behavior http://judahhimango.com/images/screwytab.png

当发生异常行为,或者该键不处理在所有,或不正确(如插入一个“\吨”字符到文本框处理不支持制表符

这只有在Firefox的ActiveX控件是我们的表格上发生

我们的问题是:。不火狐/ Gecko引擎安装某种键盘钩子的,可能导致这些副作用?或更好的y et,我们如何解决这个问题?

+0

你可以看看Firefox的源代码,它可能是找出发生了什么的最快方法。您也可以使用它们的源代码和符号服务器进行相当简单的调试(https://developer.mozilla.org/En/Using_the_Mozilla_symbol_server)。 此外,你为什么不在表单中使用基于MSHTML的webbrowser控件? – 2009-07-10 17:13:51

+0

考虑到重现这个错误并不容易(它可能会出现3%的按键),并且考虑到Mozilla是一个巨大的X平台代码库,调试Mozilla来发现这个错误似乎是一项艰巨的任务。 – 2009-07-10 17:33:40

+1

关于MSHTML,我们尝试过。它是一个错误工厂。 AccessViolationExceptions通过托管包装中的错误,COM错误;这是一场无尽的,没有结果的战斗,让这件事情奏效。 – 2009-07-10 17:34:32

回答

2

WM_CHAR消息由TranslateMessage调用生成,因此开始寻找的一个好地方是Gecko源代码中的TranslateMessage调用。

在第一个示例代码中,您提供的功能仅由两个库(mozctl.dll和xul.dll)导入。既然你声称GeckoFX也发生了同样的错误,我们可以将mozctl.dll排除在等式之外。这给我们留下了xul.dll,所以考虑到Gecko源代码,我会建议看看widget\src\windows\nsToolkit.cpp。我不确定在引擎是否嵌入时是否运行代码,但是如果是这样的话,库会在不同的线程中启动一个全新的消息泵,这个消息肯定会中断。

不幸的是,我无法运行或编译我的机器上的代码(Windows 7 x64没有安装Mozilla ActiveX控件),所以我无法用调试器验证这一点。希望它能帮助别人进一步追踪它。

0

我注意到你自己实现了所有的互操作性。你可以用GeckoFX项目试试这个,看看你是否得到了同样的错误?我在工作中使用这个项目,并没有遇到任何问题。

1

根本问题是,当Mozilla嵌入到另一个应用程序中时,它在调度内部事件时错误地泵送Windows消息。 Mozilla使用事件系统来协调跨线程或在线程上安排延迟处理(请参阅nsIThread,nsIEventTarget)。例如,如果您嵌入了一个包含大量活动XMLHTTPRequests的网页,则Mozilla将使用其事件分派接口将事件分派回javascript,并将其作为副作用泵送Windows消息。一旦Mozilla事件完全发出,它就会回到主事件循环。当Mozilla泵入Windows消息时,它不包含由应用程序的事件循环完成的额外处理 - 当Mozilla进入此过程时,IsDialogMessage(),TranslateMessage(),PreTranslateMessage()或任何其他预处理将被忽略州。因此,症状包括作为字符插入的制表键按钮,而不是用于对话导航,零星地忽略键盘热键或偶尔跳过定制消息预处理。例如,Outlook 2007/2010“撰写”屏幕偶尔会丢失击键,因为它依靠自定义邮件预处理来处理键盘输入。

请参阅https://bugzilla.mozilla.org/show_bug.cgi?id=582790了解解决该问题的修补程序。

1

我有Snoop免费和PSM反键盘记录。 其中一个检测到试图安装键盘挂钩的Firefox。 Mozilla/Firefox文件xul.dll尝试在键盘钩子处安装。 DENIED。