4

编辑:除了赏金,我们愿意支付 250 美元在 Firefox/Gecko 代码库中修复这个错误。这是一个重现问题的简单测试项目(Visual Studio 2008 C#)。

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

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

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

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

正常行为 http://judahhimango.com/images/normaltab.jpg

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

奇怪的行为 http://judahhimango.com/images/screwytab.png

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

仅当 Firefox ActiveX 控件在我们的表单上时才会发生这种情况。

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

4

4 回答 4

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 控件),因此我无法使用调试器验证其中的任何内容。希望它可以帮助有人进一步追踪它。

于 2009-08-18T07:08:46.977 回答
1

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

于 2010-08-25T16:05:41.253 回答
1

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

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

有关解决该问题的补丁,请参阅https://bugzilla.mozilla.org/show_bug.cgi?id=582790

于 2010-07-28T23:21:40.940 回答
0

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

于 2009-07-16T02:10:52.777 回答