Winforms Firefox/Gecko控件干扰Windows窗体按键

Winforms Firefox/Gecko控件干扰Windows窗体按键,winforms,firefox,hook,gecko,window-messages,Winforms,Firefox,Hook,Gecko,Window Messages,编辑:除了赏金之外,我们愿意支付250美元在Firefox/Gecko代码库中修复这个bug。(VisualStudio2008c#)复制了这个问题 编辑#2我们愿意支付600美元来修复这个bug。请参见上文中重现问题的示例项目 我们在C#Windows窗体上有一个Firefox(Gecko)ActiveX控件来显示HTML 当Firefox ActiveX控件出现在表单上时,大约2-3%的按键无法通过。或者更确切地说,将发送不同的Windows消息: 我们通过3个常规WinForms文本框按住

编辑:除了赏金之外,我们愿意支付250美元在Firefox/Gecko代码库中修复这个bug。(VisualStudio2008c#)复制了这个问题

编辑#2我们愿意支付600美元来修复这个bug。请参见上文中重现问题的示例项目

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

当Firefox ActiveX控件出现在表单上时,大约2-3%的按键无法通过。或者更确切地说,将发送不同的Windows消息:

我们通过3个常规WinForms文本框按住TAB键进行TAB。它将在97%的时间内正确运行。Spy++告诉我们WM_KEYDOWN消息已正确发送:

但是随机的,可能有2-3%的时间,tab键(或其他键)没有正确处理。Spy++告诉我们正在发送WM_CHAR:

当出现奇数行为时,要么根本没有处理密钥,要么处理不正确(例如在不支持制表符的文本框中插入“\t”字符)

只有在表单上有Firefox ActiveX控件时才会发生这种情况


我们的问题是:Firefox/Gecko引擎是否安装了某种可能导致这些副作用的键盘挂钩?或者更好的是,我们如何解决这个问题?

我注意到您自己实现了所有的互操作性。您能在项目中尝试一下,看看是否会出现相同的错误吗?我在工作,还没有遇到任何问题。

WM_CHAR消息是由TranslateMessage调用生成的,因此最好从Gecko源代码中的TranslateMessage调用开始查找

在您提供的第一个示例代码中,函数仅由两个库导入—mozctl.dll和xul.dll。由于您声称GeckoFX也会发生相同的错误,因此我们可以将mozctl.dll从等式中去掉。这就剩下了xul.dll,因此考虑到Gecko源代码,我建议查看
widget\src\windows\nsToolkit.cpp。我不确定如果嵌入引擎,代码是否运行,但如果是,则库会在不同的线程中启动一个全新的消息泵,这肯定会中断


不幸的是,我无法在我的计算机上运行或编译代码(未安装Mozilla ActiveX控件的Windows 7 x64),因此我无法用调试器验证任何一个。希望它能帮助其他人进一步跟踪它。

根本问题是,当Mozilla嵌入到另一个应用程序中时,它在发送内部事件时错误地发送Windows消息。Mozilla使用事件系统跨线程协调或安排延迟处理线程(请参阅,)。例如,如果您嵌入一个包含大量活动XMLHTTPRequests的网页,Mozilla将使用其事件分派接口将事件分派回javascript,并将windows消息作为副作用。一旦Mozilla事件被完全分派,它将返回主事件循环

当Mozilla发送windows消息时,它不包括应用程序的事件循环所做的额外处理—IsDialogMessage()、TranslateMessage()和PreTranslateMessage(),或在Mozilla进入此状态时跳过任何其他预处理。因此,症状包括将tab键作为字符插入而不是用于对话框导航、偶尔忽略键盘热键或偶尔跳过自定义邮件预处理。例如,Outlook 2007/2010“撰写”屏幕偶尔会丢失击键,因为它依赖于自定义消息预处理来处理键盘输入


有关解决此问题的修补程序,请参阅。

我有Snoop Free和PSM Anti-Keylogger。 其中一人检测到firefox试图安装键盘挂钩。 Mozilla/Firefox文件xul.dll尝试在键盘挂钩处安装。
拒绝。

您可以查看Firefox源代码,这可能是了解发生了什么情况的最快方法。您也可以使用他们的源代码和符号服务器轻松地进行调试()。此外,为什么不在表单中使用基于MSHTML的webbrowser控件呢?鉴于重现此错误并不容易(这可能发生在3%的按键操作中),并且考虑到Mozilla是一个巨大的x平台代码库,调试Mozilla以发现此错误似乎是一项艰巨的任务。关于MSHTML,我们尝试过。这是一个错误工厂。通过托管包装中的错误访问ViolationExceptions,COM错误;这是一场无休止的、毫无结果的战斗。我已经下载了您的示例项目,但无法完成复制错误。请您更具体地说明Firefox ActiveX控件:您使用的是哪个版本?您从哪里获得的?我们从Firefox代码库中获得了ActiveX控件,位于mozilla\embedding\browser\ActiveX文件夹中。没有ActiveX,这是可复制的。请参阅下面jasonh的回答,它可以通过Ge复制ckoFX项目也是如此。是的,GeckoFX也会出现同样的错误。下面是一个使用GeckoFX的测试项目:转到第二个选项卡,聚焦文本框,按住tab键约10秒。Gecko会随机将一个\t空格字符插入文本框。感谢您的回答。我们将进一步研究。有趣。不令人惊讶对我来说,似乎唯一能正确解决这个问题的方法就是建造一个不安装键盘挂钩的定制壁虎。真恶心。