如何在不破坏死键支持的情况下使用 ToUnicode?

问题描述 投票:0回答:3

已经有人问过类似的问题,所以我不会浪费时间重新解释它,可以在这里找到现有的讨论: 键盘挂钩中的 ToAscii/ToUnicode 会破坏死键

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

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

但是我不确定如何实施建议的解决方案。如果能朝着正确的方向推动,我们将不胜感激。

明确地说,我指的部分是:

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

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

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

我不太确定如何做这两件事(键盘和国际化远不是我的强项),所以任何帮助将不胜感激。

谢谢

c++ c windows unicode keyboard
3个回答
5
投票

答案的第一部分是完全无信息。不过,第二部分确实有道理。

ToUnicode()
should 是一个纯函数,仅充当查找的作用。然而,事实并非如此。但您可以针对所有预期输入重复调用它,将它们存储在您自己的查找表中并访问它。

我建议微软在

lookDontTouch
参数中添加一个
wFlags
标志;这将是一个简单的、不间断的 API 修复。


0
投票

如果您扩大搜索范围以包括键盘记录,您可能会得到一些答案。链接中提供的方法与

ToUnicode
相比极其麻烦,但它确实有效。它的发展围绕着从注册表中查找当前活动的键盘布局,然后手动加载并解析正确的 DLL。

作为警告,我发现加载部分在 64 位 Windows 上严重失败。


0
投票

来自

MSalters
的答案的这个标志现在已经存在(
0x04
)。

对于没有此标志可以做什么的简短总结,我参考我的这个答案

———————————————————————————

总的来说,这里讨论的 Kaplan 的“加载 DLL 并解析信息”的方法导致了无数有缺陷的程序的集合!例如,我怀疑 Firefox 和 Chrome 正在这样做 ——所以我需要花费无法估量的时间来解决由此产生的错误……(对于 Firefox,其中一些已修复——在我报告错误后,但还有很多其他问题…… )

© www.soinside.com 2019 - 2024. All rights reserved.