Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我如何使用ToUnicode而不破坏死键支持?_C++_C_Windows_Unicode_Keyboard - Fatal编程技术网

C++ 我如何使用ToUnicode而不破坏死键支持?

C++ 我如何使用ToUnicode而不破坏死键支持?,c++,c,windows,unicode,keyboard,C++,C,Windows,Unicode,Keyboard,已经有人问过类似的问题,所以我不想浪费时间重新解释,可以在这里找到现有的讨论: 然而,我之所以发布一个新问题,是因为我似乎遇到了一个“解决方案”,但我不太确定如何实施它 这篇博文似乎为ToUnicode杀死死键支持的问题提出了一个解决方案: 但是,我不确定如何实施建议的解决方案。如果能朝着正确的方向努力,我们将不胜感激 说清楚一点,我指的是: 有两种方法可以解决此问题: 1) 您可以继续使用相同的信息调用ToUnicode,直到它被清除,然后再调用它一次,将状态恢复到以前的状态(如果您从未键

已经有人问过类似的问题,所以我不想浪费时间重新解释,可以在这里找到现有的讨论:

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

这篇博文似乎为ToUnicode杀死死键支持的问题提出了一个解决方案:

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

说清楚一点,我指的是:

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

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

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

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


谢谢

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


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

如果您将搜索范围扩大到包含,您可能会得到一些答案。与
ToUnicode
相比,链接中提供的方法非常麻烦,但它可以工作。它围绕着从注册表中查找当前活动键盘布局,然后手动加载和解析正确的DLL展开


作为警告,我已经看到加载部分在64位Windows上严重失败。

但是修复win32 API将是一个危险的先例。想想如果他们开始走这条路,他们会有多少工作要做。@jalf:我不确定这是否是讽刺。Windows的i18n/l10n正在开发中。对于这一点,他们可能不需要.Net代码(键盘处理是相当低级的),因此修复Win32 API是一个合理的建议,可能是唯一的建议。有没有可能通过代码示例将我推向正确的方向?我不好意思说我还是有点迷路。啊,我太讨厌这个键盘了。谢谢。是的,它是用来讽刺的。只是有太多的Win32 API需要修复。:)实际上,不需要添加类似于
lookdontouch
标志的内容。看见在MapVirtualKey的返回值上引用MSDN,如果使用MAPVK_VK_TO_CHAR:[…]通过设置返回值的顶部位来指示死键(变音键)。[…]我运行了一些快速测试,似乎在x64版本的Windows下,代码确实失败了,除非代码是为x64本机编译的。啊,这真是让人头疼。不过谢谢,这看起来是个有趣的选择。