1

当我在Windows 7中切换到俄语版式并按;键盘上的键,我在屏幕上得到俄语字母жC++ Win32:将扫描代码转换为Unicode字符

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

// 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); 

变量测试的值是1078!我不明白为什么要将ж转换为虚拟键给我1078,但是转换1078虚拟键(使用相同的键盘布局)会给我Ð

+0

我总是使用['WM_CHAR'](http://msdn.microsoft.com/zh-cn/library/ms646276(v = vs.85).aspx)读取扫描代码,因为它的翻译工作为你并以UTF-16返回最后的字符。适用于所有语言,即使是用一次以上的按键代表单个字符的语言。 – 2011-04-17 01:44:40

+0

我想通了,但网站不让我在24小时内回答我自己的问题。谢谢! – Evgeny 2011-04-17 03:38:14

+0

@乔什布朗:请张贴作为答案,我可以upvote它。 – 2011-09-01 21:53:41

回答

2

我总是使用WM_CHAR来读取扫描码,因为它为您做翻译工作,并以UTF-16格式返回最终字符。适用于所有语言,即使是用一次以上的按键代表单个字符的语言。