为什么CreateAcceleratorTable和TranslateAccelerator函数的Unicode和ANSI版本?

时间:2018-06-05 02:45:24

标签: winapi

据我所知,CreateAcceleratorTable函数和TranslateAccelerator函数都不处理字符串或字符数据,所以我想知道为什么它们都有Unicode和ANSI版本?这是ACCEL数据结构。

1 个答案:

答案 0 :(得分:3)

Admin: id - name - company 1 - teste - teste2 2 - teste3 - teste4 Docs: id_doc - id_admin_doc - doc - value 1 - 1 - doc_1 - t 2 - 1 - doc_2 - t 3 - 1 - doc_3 - t 4 - 2 - doc_1 - t 5 - 2 - doc_2 - t 6 - 1 - doc_4 - t 7 - 2 - doc_3 - t 8 - 1 - doc_5 - t 会处理字符数据。

根据MSDN documentation of ACCEL structure

  

<强>键
  键入: WORD

     

加速键。该成员可以是虚拟密钥代码,也可以是字符代码。

字符代码不仅仅是ASCII字符。超出ASCII范围,其含义取决于它是ANSI还是Unicode。

为什么字符代码会超过ASCII?不是我们的键盘只有ASCII字符吗?嗯,这是我的猜测。想象一下,在ANSI默认使用Shift-JIS的日本Windows上,使用假名输入的日本用户(键击可以直接键入あ/い/う/え......)按下那些假名的加速键,如{{ 1}}。

对于CreateAcceleratorTable,由于加速器可以是非ASCII,因此还需要翻译Ctrl+あTranslateAccelerator,{{1}的密钥代码在传递给内部实现之前,将Unicode和WM_KEYDOWN转换为Unicode。

以下代码摘自泄露的Windows 2000源代码。

Unicode版本:

WM_SYSKEYDOWN

ANSI版本:

WM_CHAR

WM_SYSCHAR的源代码可以是found here