在Mono on Mac下检测WinForms应用程序中的键组合时出现问题

时间:2012-09-14 09:39:32

标签: winforms mono

我正在尝试使用Mono在Mac上运行.net 2 Windows.Forms应用程序。该应用程序具有所有功能的组合快捷键,具有预定义的默认值,可由用户重新配置。 Form KeyDown事件处理程序查找要执行的操作。

我的问题是将Modifiers和KeyCode与按下的实际键相关联。我不介意是否需要为Mac添加一些映射,但我需要至少3个修改键。然而,在Mac上的4个修饰符中,似乎很少产生明显的结果。我明白了: Shift - 按预期工作 Ctrl - 报告不同的KeyCode,但使用正确的修饰符(例如Ctrl + N具有Modifiers = Control和KeyCode 14 =“RButton,Clear”)。
Alt - 报告其他一些未经修改的键(例如Alt + R给出KeyCode = 168 =“BrowserRefresh”) Cmd - 使用预期的KeyCode报告为Alt(例如,Cmd + N显示为Alt-N)

我认为在Windows上使用Ctrl的情况下通常会使用Cmd键。任何人都可以建议我应该尝试使用三个Mac键中的哪一个?最重要的是如何解析KeyEventArgs以始终报告基本密钥加上三个可选修饰符?

Mono是最新版本(截至一周或两周前),它是MacBook Air,OS X 10.8.1,如果这有任何区别。

2 个答案:

答案 0 :(得分:1)

我遇到了同样的问题。尝试使用IRC并在房间Mono和MonoMac上的irc.gnome.org询问。非常有帮助的人。

显然使用MonoMac,它允许您在Interface Builder中构建本机UI,并帮助存根后端C#代码与之通信(也就是说,MonoMac是Mono与本机Mac通信,不是< / em> Mono 在Mac上运行;第二个只是简单的Mono),Windows.Forms支持已经落到了路边 - 我被告知Windows.Forms在Mac上基本上“死了” ,安静的bugzilla page似乎支持这一点。这真的很不错。我遇到了PickBackColor不能在RichTextBox中工作,然后菜单加速器无法正常工作。我认为Mac上的Windows.Forms是alpha到beta的质量。

那就是说,对于本质上是爱的劳动,令人惊讶的Windows.Forms运行良好,但我不会将它用于一个优秀的应用程序。祝你好运。

编辑:我意识到OP并没有特别谈论菜单项,但是这里有关于加速器和菜单项不能很好地运行的错误报告,只是为了说明相关的bugginess。

[Mono-bugs] [Bug 75996][Maj] New - menuitem event not triggered by Shortcut

Mono上的Windows.Forms是如此接近工作,很有可能认为它会支持你需要完成的工作,但是,我认为它足够坚固,除了使用快速的实用工具之外,这将是一个错误。 / p>

答案 1 :(得分:1)

如果它对任何人都有用,这就是我最终的结果: 我最终设法通过创建一个新的KeyData值来替换事件提供的值来解决这个特定的“功能”(这个代码只有在它运行时才会运行)。 我交换了一些修改器以使其与窗口更加一致(即如果按下Cmd,并通过Mono报告为Alt,我将其更改为Ctrl)。我还过滤掉了ctrl + A到ctrl + Z,它返回KeyCodes 0到25(不是65到90)并用它们的正常值替换它们。 幸运的是,我的代码只需要KeyData。使用更新的数据创建新的KeyEventArgs是不可能的,因为除了传递给KeyEventArgs构造函数的任何修饰符之外,Mono还会检查当前键盘状态并为任何按下的修改键设置修饰符标记。

但是 - 正如Ruffin评论Mac上的Mono非常脆弱。我们暂时搁置了这项工作,因为需要花费大量时间来解决所有问题。到目前为止,我们已经设法找到了我们所看到的每个项目的解决方案,并且可能会回到这一点 - 但最好是在Mac上运行此S / W将是一个讨厌的黑客。