代码之家  ›  专栏  ›  技术社区  ›  Judah Gabriel Himango

firefox/gecko控件干扰Windows窗体按键

  •  4
  • Judah Gabriel Himango  · 技术社区  · 15 年前

    编辑 :除了赏金之外,我们还愿意支付250美元在firefox/gecko代码库中修复这个bug。 Here is a simple test project (Visual Studio 2008 c)复制了问题。

    编辑第2页 我们愿意花600美元来修复这个漏洞。关于重现问题的示例项目,请参见上文。

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

    当这个firefox activex控件在我们的表单上时,大约2-3%的按键无法通过。或者,发送不同的Windows消息:

    我们通过3个常规的winforms文本框按住tab键to tab。97%的时候它会正常工作。Spy++告诉我们wm_keydown消息已正确发送:

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

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

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

    当出现异常行为时,要么根本不处理该键,要么处理不正确(例如在不支持制表符的文本框中插入一个'\t'字符)。

    只有当Firefox ActiveX控件在我们的窗体上时才会发生这种情况。

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

    4 回复  |  直到 14 年前
        1
  •  2
  •   Filip Navara    15 年前

    wm_char消息是由translateMessage调用生成的,因此开始查找的一个好地方是gecko源代码中的translateMessage调用。

    在第一个示例代码中,您提供的函数仅由两个库(mozctl.dll和xul.dll)导入。既然您声称同样的错误也发生在geckofx中,我们可以将mozctl.dll从公式中去掉。这就剩下了xul.dll,所以考虑到gecko的源代码,我建议您研究一下 widget\src\windows\nsToolkit.cpp . 如果嵌入了引擎,我不确定代码是否运行,但是如果是这样,库将在不同的线程中启动一个全新的消息泵,这必然会中断。

    不幸的是,我不能在我的机器上运行或编译代码(没有安装MozillaActiveX控件的Windows7x64),所以我不能用调试器来验证其中的任何一个。希望它能帮助人们进一步追踪。

        2
  •  1
  •   dmercredi    14 年前

    根本问题是,当Mozilla嵌入到另一个应用程序中时,它在发送内部事件时错误地发送Windows消息。Mozilla使用一个事件系统来协调线程之间的关系或调度线程上的延迟处理(请参见 nsIThread , nsIEventTarget )。例如,如果您嵌入一个带有大量活动xmlhttprequest的网页,Mozilla将使用其事件调度接口将事件分派回javascript,并将Windows消息作为副作用发送。一旦mozilla事件被完全调度,它将返回到主事件循环。

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

    https://bugzilla.mozilla.org/show_bug.cgi?id=582790 一个解决问题的补丁。

        3
  •  1
  •   Kevin    14 年前

    我有免费的snoop和psm防钥匙记录器。 其中一个检测到火狐试图安装键盘挂钩。 mozilla/firefox文件xul.dll试图在键盘挂钩处安装。 否认。

        4
  •  0
  •   jasonh    15 年前

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