可以从Win32函数ToUnicode()/ ToAscii()输出的最大字符数是多少?
在给定虚拟键码,扫描键码和键盘状态的情况下,它可以输出的内容是否合理上限?
答案 0 :(得分:2)
在我的Windows 8计算机上USER32!ToAscii
使用内部缓冲区调用USER32!ToUnicode
并将cchBuff
设置为2.因为ToAscii
的输出为LPWORD
且不是LPSTR
我们无法对此调查中ToUnicode
的实际限制做出任何假设,但我们知道ToAscii
始终将输出WORD
}。返回值告诉您此WORD
的0,1或2个字节是否包含有用数据。
继续ToUnicode
,事情变得有点棘手。如果它返回0则没有写入任何内容。如果它返回1或-1,则写入一个UCS-2代码点。然后我们留下奇怪的2 <= return
表达式。我们可以尝试剖析MSDN文档:
两个或多个字符被写入pwszBuff指定的缓冲区。最常见的原因是存储在键盘布局中的死键字符(重音符号或变音符号)无法与指定的虚拟键组合以形成单个字符。但是,缓冲区可能包含的字符数多于返回值指定的字符数。发生这种情况时,任何额外的字符都无效,应该被忽略。
您可以将其解释为&#34;写入了两个或更多字符,但只有两个字符有效且#34;但是,返回值应记录为2
而不是2 ≤ value
。
我相信在这句话中有两件事情我们应该消除所谓的&#34;额外的角色&#34;:
但是,缓冲区可能包含的字符数多于返回值指定的字符数。
这只是意味着函数可以在缓冲区上超出它实际返回的有效值。这可以通过以下方式得到证实:
发生这种情况时,任何额外的字符都无效,应该被忽略。
这让我们留下了不幸的开场白:
两个或多个字符被写入pwszBuff指定的缓冲区。
我想象返回值2没有问题,它可以像基本字符和diacritic一样简单,而不是作为预先组合的代码点存在。
&#34;或更多&#34;部分可能来自多个来源。如果基本字符被编码为代理对,那么任何额外的变音符号/组合字符将推动你超过2.基本字符上也可能只有一个以上的变音符号/组合字符。甚至可能存在领先的LTR / RTL标记。
我不知道是否有可能同时结束所有3个条件,但我会安全地播放并指定10个左右WCHAR的缓冲区。这应该完全在你可以在键盘上产生的限制内进行#34;一次击键&#34;。
这绝不是最终答案,但除非微软的某些人做出回应,否则它可能是最好的答案。