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格式返回最終字符。適用於所有語言,即使是用一次以上的按鍵代表單個字符的語言。