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虛擬鍵(使用相同的鍵盤佈局)會給我Ð。
我總是使用['WM_CHAR'](http://msdn.microsoft.com/zh-cn/library/ms646276(v = vs.85).aspx)讀取掃描代碼,因爲它的翻譯工作爲你並以UTF-16返回最後的字符。適用於所有語言,即使是用一次以上的按鍵代表單個字符的語言。 – 2011-04-17 01:44:40
我想通了,但網站不讓我在24小時內回答我自己的問題。謝謝! – Evgeny 2011-04-17 03:38:14
@喬什布朗:請張貼作爲答案,我可以upvote它。 – 2011-09-01 21:53:41