【问题标题】:How can I use ToUnicode without breaking dead key support?如何在不破坏死键支持的情况下使用 ToUnicode?
【发布时间】:2011-02-05 23:12:47
【问题描述】:

已经提出了类似的问题,所以我不会浪费时间重新解释它,可以在这里找到现有的讨论: ToAscii/ToUnicode in a keyboard hook destroys dead keys

然而,我发布一个新问题的原因是我似乎遇到了一个“解决方案”,但我不太确定如何实施它。

这篇博文似乎提出了解决ToUnicode杀死死键支持问题的方法: http://www.siao2.com/2005/01/19/355870.aspx

但是我不确定如何实施建议的解决方案。非常感谢您朝着正确的方向前进。

要清楚,我指的部分是这样的:

有两种方法可以解决这个问题:

1) 您可以使用相同的信息继续调用 ToUnicode,直到它被清除,然后再调用一次以将状态恢复到您从未输入过任何内容的状态,或者

2) 您可以提前加载所有键盘信息,然后当他们键入信息时,您可以在自己的信息缓存中查找击键的含义,而无需稍后调用 API。

我不太确定如何做这两件事(键盘和国际化远不是我的强项),因此我们将不胜感激。

谢谢

【问题讨论】:

    标签: c++ c windows unicode keyboard


    【解决方案1】:

    如果您将搜索范围扩大到包括key logging,您可能会得到一些答案。与ToUnicode相比,链接中介绍的方法极其繁琐,但确实有效。它围绕从注册表中查找当前活动的键盘布局,然后手动加载和解析正确的 DLL 展开。

    作为警告,我看到加载部分在 64 位 Windows 上惨遭失败。

    【讨论】:

    • 我进行了一些快速测试,似乎代码在 x64 版本的 Windows 下确实失败了,除非代码是为 x64 本地编译的。呃,这一切都让人头疼。不过谢谢,这看起来是一个有趣的选择。
    【解决方案2】:

    答案的第一部分是完全无信息的。但是,第二部分确实有意义。 ToUnicode() 应该是一个纯函数,它只是作为一个查找。然而,事实并非如此。但是您可以为所有预期的输入重复调用它,将它们存储在您自己的查找表中并访问它。

    我建议微软在wFlags 参数中添加一个lookDontTouch 标志;这将是一个微不足道的非破坏性 API 修复。

    【讨论】:

    • 但修复 win32 API 将是一个危险的先例。想想如果他们从那条路径开始,他们将面临的工作量。
    • @jalf:我不确定这是不是讽刺。 Windows 的 i18n/l10n 正在积极开发中。对于这一特殊位,他们可能不想要 .Net 代码(键盘处理相当低级),因此修复 Win32 API 是一个合理的建议,可能是唯一的建议。
    • 是否有任何代码示例可以将我推向正确的方向?我很尴尬地说我还是有点失落。呃,我非常讨厌这个键盘的东西。谢谢。
    • 是的,它是为了讽刺。只是有很多 Win32 API 可以修复。 :)
    • 其实不需要添加lookDontTouch标志之类的东西。见my answer。如果使用 MAPVK_VK_TO_CHAR,则在 MapVirtualKey 的返回值上引用 MSDN:[...] 通过设置返回值的最高位来指示死键(变音符号)。 [...]
    猜你喜欢
    • 2010-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多