【问题标题】:C++ Win32: Converting scan code to Unicode characterC++ Win32:将扫描码转换为 Unicode 字符
【发布时间】:2011-04-17 00:07:44
【问题描述】:

当我在 Windows 7 中切换到俄语布局并按键盘上的 ; 键时,屏幕上出现俄语字母 ж

我正在开发一个需要检测按键并在屏幕上绘制文本的应用程序。要求是处理所有支持的语言。这是我的代码:

// I scan the keyboard for pressed keys
for (short key = KEY_SCAN_MIN; key <= KEY_SCAN_MAX; ++key)
{
    if (GetAsyncKeyState(key) & 0x8000)
    {

// When I detect a pressed key, I convert the scan code into virtual key. 
// The hkl is current keyboard layout parameter, which is Russian.
UINT virtualKey = MapVirtualKeyEx((UINT)key, MAPVK_VK_TO_CHAR, hkl);

// Next I get the state of the keyboard and convert the virtual key 
// into Unicode letter
if (!GetKeyboardState(kbrdState))
{
     continue;
}

// unicode is defined as wchar_t unicode[2];                    
int result = ToUnicodeEx(virtualKey, key, (BYTE*)kbrdState, unicode, 2, 0, hkl);

除了几个俄语字母外,一切都很好,我不知道为什么。一个不起作用的特定字母是ж。当我尝试翻译它的扫描码时,翻译结果是б,这是一个不同的俄语字母。

我已经花了一整天的时间调试这个问题,并没有走得太远。当我按下这个俄语键时,我得到 168 的扫描码和 1078 的虚拟键。我做了这个小测试,将字母转换回虚拟键。

short test = VkKeyScanEx(L'ж', hkl);

变量test的值为1078!我不明白为什么将字母 ж 转换为虚拟键给我 1078 但转换 1078 虚拟键(使用相同的键盘布局)给我 б

【问题讨论】:

  • 我总是使用WM_CHAR 来读取扫描码,因为它会为您完成翻译工作并以 UTF-16 格式返回最终字符。适用于所有语言,即使是那些需要多次按键才能表示单个字符的语言。
  • 我想通了,但该网站不允许我在 24 小时内发布我自己问题的答案。谢谢!
  • @Josh Brown:请将其发布为答案,以便我投票。
  • 1078ж 的十进制值(代码点U+0436)所以result = ToUnicodeEx( … ,hkl) 返回一个正确的值。作为旁注,VkKeyScanEx('ж', hkl); 使用相同的hkl 返回88(我想0x04190419)。

标签: visual-c++ unicode internationalization keyboard keyboard-events


【解决方案1】:

我总是使用WM_CHAR 来读取扫描码,因为它会为您完成翻译工作并以 UTF-16 格式返回最终字符。适用于所有语言,包括需要多次按键才能表示单个字符的语言。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-24
    相关资源
    最近更新 更多