发表于 2006-04-25 19:54 IP属地:未知
不知你是否使用Firefox,在Firefox下使用紫光拼音有一个很烦人的问题,每次输入数字或者标点都会变成两个字符一起输入。
不过现在这个问题已经有人解决了(声明我是看不明白)
作者说::
这个问题在 Gecko 1.8 出来后就一直存在了. 主要原因是 Gecko 1.8 的 nsWindow.cpp 中的 nsWindow::OnKeyDown 方法为了兼容几个日文的输入法改了一大堆. 最后变成了这样: 只要有+-/*.,=;`'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ 这些键 WM_KEYDOWN 了, 不管是否后续会有 WM_CHAR 或者 WM_IME_CHAR, 都会产生一个NS_KEY_PRESS event. 本来也是很正常的事. 可是紫光偏偏在中文输入模式下按 01234567890;',./`-= 这些键的时候在该产生的 WM_KEYDOWN, WM_CHAR, WM_KEYUP 序列之前还会有一个 WM_KEYDOWN, WM_KEYUP 序列. 对于通常的程序这不构成问题, 这一对消息会被 ignore 的. 但是在 Gecko 1.8 这里就出问题了, 这一对消息产生了一个额外的 NS_KEY_PRESS event, 于是我们就可以看到一下输入两个符号的现象了.
严格说来, 很难说这是谁的问题. Windows 也不存在一个标准说怎么样的 WM 序列才是正确的. 反正就是不兼容了. 紫光没有源码, 所以只好来改 Gecko 了.
fix 很简单:
bash-2.05b$ diff -u widget/src/windows/nsWindow.cppwidget/src/windows/nsWindow.cpp.orig--- widget/src/windows/nsWindow.cpp 2006-02-10 11:22:20.000000000 +0800+++ widget/src/windows/nsWindow.cpp.orig 2006-02-10 11:24:30.000000000+0800@@ -3578,7 +3578,7 @@ } }- if (asciiKey && !(gotMsg && msg.message == WM_KEYUP))+ if (asciiKey) DispatchKeyEvent(NS_KEY_PRESS, asciiKey, 0, aKeyData, extraFlags); else DispatchKeyEvent(NS_KEY_PRESS, 0, virtualKeyCode, aKeyData, extraFlags);