Visual c++ C++;Win32:将扫描代码转换为Unicode字符

Visual c++ C++;Win32:将扫描代码转换为Unicode字符,visual-c++,unicode,internationalization,keyboard,keyboard-events,Visual C++,Unicode,Internationalization,Keyboard,Keyboard Events,当我在Windows 7中切换到俄文布局并按时键,我在屏幕上看到俄文字母ж 我正在开发一个应用程序,需要检测按下的键并在屏幕上绘制文本。该要求适用于所有受支持的语言。这是我的代码: // I scan the keyboard for pressed keys for (short key = KEY_SCAN_MIN; key <= KEY_SCAN_MAX; ++key) { if (GetAsyncKeyState(key) & 0x8000) { // W

当我在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);

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

我总是在为您进行翻译工作时读取扫描代码,并返回UTF-16中的最终字符。适用于所有语言,即使是需要一次以上按键才能表示单个字符的语言。

我始终使用扫描代码,因为它可以为您进行翻译并返回UTF-16中的最终字符。适用于所有语言,即使是需要一次以上按键才能代表一个字符的语言。我发现了这一点,但网站不允许我在24小时内发布自己问题的答案。谢谢大家!@乔什·布朗:请把它作为一个答案发布,这样我就可以投票了。
1078
ж
(codepoint
U+0436
)的十进制值,所以
result=ToUnicodeEx(…,hkl)
返回一个正确的值。作为旁注,
VkKeyScanEx('ж',hkl)
使用相同的
hkl
返回
88
(我想
0x04190419
)。
short test = VkKeyScanEx(L'ж', hkl);