2

处理键盘事件的 OS X 实现的方式似乎存在错误。当快速连续按下多个键或同时按下多个键时,该错误就会显现出来。

如果我同时按“J”“K”“L”键,在 Win7 上运行我的应用程序,我总是可以得到所有三个键(尽管不是以任何特定顺序)。但在 OS X 上,在运行 Windows 窗体应用程序时,我可以得到“JJJ”或“JKK”或“LLL”。在 OS X 的其他任何地方都没有表现出这种行为(原生 Cocoa 应用程序,例如 TextEdit,其行为与 Win7 相同)。

源代码:(在 Visual Studio 中,创建一个 windows 窗体项目,并编辑 Form1 的代码):

public partial class Form1 : Form
{
    public Form1(){
        InitializeComponent();
        KeyPress += Form1_KeyPress;
        KeyDown += Form1_KeyDown;}
    void Form1_KeyDown(object sender, KeyEventArgs e)
        {Console.WriteLine("KeyDown: " + e.KeyCode.ToString());}
    void Form1_KeyPress(object sender, KeyPressEventArgs e)
        {Console.WriteLine("KeyPress: " + e.KeyChar.ToString());}
}

在 Windows 7 上运行(一次性使用 JKL):

KeyDown: L
KeyPress: l
KeyDown: J
KeyPress: j
KeyDown: K
KeyPress: k

在 OS X 上运行(一次全部命中 JKL;请注意,它可能需要几次尝试)

KeyDown: L
KeyPress: k
KeyDown: J
KeyPress: k
KeyDown: K
KeyPress: k

如果你错过了,所有的 KeyPress 事件都是'k',结果是'kkk'。这是为什么?

更新:我在 Mountain Lion 上运行 Mono 2.10.10。

4

0 回答 0