ToUnicodeEx 函数 (winuser.h)

将指定的虚拟键代码和键盘状态转换为相应的 Unicode 字符或字符。

语法

int ToUnicodeEx(
  [in]           UINT       wVirtKey,
  [in]           UINT       wScanCode,
  [in]           const BYTE *lpKeyState,
  [out]          LPWSTR     pwszBuff,
  [in]           int        cchBuff,
  [in]           UINT       wFlags,
  [in, optional] HKL        dwhkl
);

参数

[in] wVirtKey

类型:UINT

要转换的虚拟密钥代码。 请参阅 Virtual-Key 代码

[in] wScanCode

类型:UINT

要转换的密钥的硬件 扫描代码。 如果键已启动,则设置此值的高序位。

[in] lpKeyState

类型:const BYTE*

指向包含当前键盘状态的 256 字节数组的指针。 数组中的每个元素(字节)都包含一个键的状态。

如果设置了字节的高序位,则键已关闭。 如果已设置,则为低位指示键处于打开模式。 在此函数中,只有 CAPS LOCK 键的切换位是相关的。 NUM LOCK 和 SCROLL LOCK 键的切换状态将被忽略。 有关详细信息,请参阅 GetKeyboardState

[out] pwszBuff

类型:LPWSTR

接收已翻译字符或字符作为 UTF-16 代码单元数组的缓冲区。 即使变量名称建议以 null 结尾,也可以返回此缓冲区,而不会以 null 结尾。 可以使用此方法的返回值来确定写入的字符数。

[in] cchBuff

类型:int

pwszBuff 参数指向的缓冲区的大小(以字符为单位)。

[in] wFlags

类型:UINT

函数的行为。

如果设置了位 0,则菜单处于活动状态。 在此模式下,不处理 Alt+Numeric 键盘 组合键。

如果设置了位 1,ToUnicodeEx 将转换标记为键中断事件的扫描码,以及其通常处理密钥生成事件。

如果设置了位 2,则键盘状态不会更改(Windows 10 版本 1607 及更新版本)

所有其他位(到 31 位)均保留。

[in, optional] dwhkl

类型:HKL

用于转换指定代码的输入区域设置标识符。 此参数可以是以前由 LoadKeyboardLayout 函数返回的任何输入区域设置标识符。

返回值

类型:int

该函数返回以下值之一。

返回值 描述
< 0
指定的虚拟键是 死键 字符(着色或音调)。 无论键盘布局如何,都会返回此值,即使键入了多个字符,并且存储在键盘状态中。 如果可能,即使使用 Unicode 键盘布局,该函数也已将死键字符的间距版本写入到 由 pwszBuff指定的缓冲区。 例如,该函数写入字符 ACUTE ACCENT(U+00B4),而不是字符组合锐音(U+0301)。
0
指定的虚拟键没有键盘当前状态的转换。 pwszBuff指定的缓冲区未写入任何内容。
> 0
pwszBuff指定的缓冲区中写入了一个或多个 UTF-16 代码单元。 返回 pwszBuff 可能包含的字符数可能多于返回值指定的字符。 发生这种情况时,任何额外的字符都无效,应忽略。

言论

输入区域设置标识符是比键盘布局更广泛的概念,因为它还可以包含语音转文本转换器、输入法编辑器(IME)或任何其他形式的输入。

某些键盘布局可能会返回多个字符和/或补充字符,因为 pwszBuff中的 代理项对。 如果键盘布局中存储的死键字符(口音或音调符号)无法与指定的虚拟键组合,形成单个字符,则可以将上一个输入的死字符与当前字符组合在一起。

提供给 ToUnicodeEx 函数的参数可能不足以转换虚拟键代码,因为以前 死键 存储在键盘布局中。

通常,ToUnicodeEx 基于虚拟密钥代码执行转换。 但在某些情况下,可以使用 wScanCode 参数的位 15 来区分按键和键释放(例如 Alt+numpad 键条目)。

由于 ToUnicodeEx 转换虚拟键代码,它还会更改内核模式键盘缓冲区的状态。 此状态更改会影响死键、连字、Alt+Numeric 键盘 键输入等。 如果与 TranslateMessage 结合使用(这也更改内核模式键盘缓冲区的状态),也可能会导致意外的副作用。

要求

要求 价值
最低支持的客户端 Windows 2000 Professional [仅限桌面应用]
支持的最低服务器 Windows 2000 Server [仅限桌面应用]
目标平台 窗户
标头 winuser.h (包括 Windows.h)
User32.lib
DLL User32.dll

另请参阅

概念

键盘输入

LoadKeyboardLayout

参考

ToAsciiEx

VkKeyScan