ToAscii 函数 (winuser.h)

将指定的虚拟键代码和键盘状态转换为相应的一个或多个字符。 该函数使用输入语言和由键盘布局句柄标识的物理键盘布局转换代码。

若要指定用于转换指定代码的键盘布局的句柄,请使用 ToAsciiEx 函数。

注意

此方法可能无法正常使用某些键盘布局,这些 键盘布局 可能会生成多个字符 (即,只需按一次键即可) 和/或补充 Unicode 字符。 强烈建议使用可正确处理此类情况的 ToUnicodeToUnicodeEx 方法。

语法

int ToAscii(
  [in]           UINT       uVirtKey,
  [in]           UINT       uScanCode,
  [in, optional] const BYTE *lpKeyState,
  [out]          LPWORD     lpChar,
  [in]           UINT       uFlags
);

参数

[in] uVirtKey

类型: UINT

要转换的虚拟密钥代码。 请参阅虚拟键代码

[in] uScanCode

类型: UINT

要转换的密钥的硬件扫描代码。 如果键处于打开状态 (未按) ,则设置此值的高阶位。

[in, optional] lpKeyState

类型: const BYTE*

指向包含当前键盘状态的 256 字节数组的指针。 数组中 (字节) 的每个元素都包含一个键的状态。 如果设置了字节的高阶位,则 (按下) 键。

低位(如果已设置)表示键已打开。 在此函数中,仅 CAPS LOCK 键的切换位相关。 忽略 NUM LOCK 和 SCROLL LOCK 键的切换状态。

[out] lpChar

类型: LPWORD

指向缓冲区的指针,该缓冲区接收转换字符 (或打包到单个 WORD 值的两个字符,其中低序字节包含第一个字符,高序字节包含第二个字符) 。

[in] uFlags

类型: UINT

如果菜单处于活动状态,此参数必须为 1,否则为 0。

返回值

类型: int

返回值是以下值之一。

返回值 说明
0
指定的虚拟键对键盘的当前状态没有转换。
1
已将一个字符复制到缓冲区。
2
已将两个字符复制到缓冲区。 当键盘布局中存储的死键 (重音符或音调) 不能使用指定的虚拟键组合形成单个字符时,通常会发生这种情况。

备注

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

通常, ToAscii 会基于虚拟密钥代码执行转换。 但在某些情况下, uScanCode 参数的第 15 位可用于区分按键和释放键。 扫描代码用于转换 Alt+ 数字组合键

尽管 NUM LOCK 是影响键盘行为的切换键,但 ToAscii 会忽略切换设置, (lpKeyState (VK_NUMLOCK) 的低位) ,因为 uVirtKey 参数单独足以区分光标移动键 (VK_HOMEVK_INSERT等) (VK_DECIMAL - VK_NUMPAD0VK_NUMPAD9) 。

要求

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

请参阅

概念性

键盘输入

OemKeyScan

引用

ToAsciiEx

ToUnicode

VkKeyScan